Skip to content

feat(bedrock_agent): add new Amazon Bedrock Agents Functions Resolver #6564

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

Open
wants to merge 29 commits into
base: develop
Choose a base branch
from

Conversation

anafalcao
Copy link
Contributor

@anafalcao anafalcao commented Apr 25, 2025

Issue number: #6300

Summary

This PR introduces support for Bedrock Agents Functions, providing the user a similar experience from the current Bedrock Agents with OpenAPI Resolver.

Changes

  • Bedrock Agent Functions data class
  • BedrockFunctionsResponseBuilder
  • BedrockAgentFunctionResolver
  • Optional response fields - sessionAttributes, promptSessionAttributes, knowledgeBasesConfiguration
  • Parser
  • Additional validations
  • name on Tool decorator
  • Documentation with examples

User experience

from aws_lambda_powertools.event_handler import BedrockAgentFunctionResolver
from aws_lambda_powertools.utilities.typing import LambdaContext

app = BedrockAgentFunctionResolver()

@app.tool(name="currentTime", description="Gets the current UTC time")
def get_current_time():
    ... 
@app.tool(description="Greets the user using name")
def greet_user(name):
...
@app.tool(description="Add two numbers")
def simple_calculator(a, b, operation):
...
def lambda_handler(event: dict, context: LambdaContext) → dict:
    return app.resolve(event, context)

Checklist

If your change doesn't seem to apply, please leave them unchecked.

Is this a breaking change?

RFC issue number:

Checklist:

  • Migration process documented
  • Implement warnings (if it can live side by side)

Acknowledgment

By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

Disclaimer: We value your time and bandwidth. As such, any pull requests created on non-triaged issues might not be successful.

@boring-cyborg boring-cyborg bot added the tests label Apr 25, 2025
@pull-request-size pull-request-size bot added the size/L Denotes a PR that changes 100-499 lines, ignoring generated files. label Apr 25, 2025
@github-actions github-actions bot added the feature New feature or functionality label Apr 25, 2025
@anafalcao anafalcao self-assigned this Apr 25, 2025
@anafalcao anafalcao linked an issue Apr 25, 2025 that may be closed by this pull request
2 tasks
Copy link

codecov bot commented Apr 25, 2025

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 96.15%. Comparing base (d89f1f9) to head (9914ab5).
Report is 8 commits behind head on develop.

Additional details and impacted files
@@             Coverage Diff             @@
##           develop    #6564      +/-   ##
===========================================
+ Coverage    96.09%   96.15%   +0.05%     
===========================================
  Files          254      256       +2     
  Lines        12179    12350     +171     
  Branches       905      916      +11     
===========================================
+ Hits         11704    11875     +171     
  Misses         373      373              
  Partials       102      102              

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@pull-request-size pull-request-size bot added size/XL Denotes a PR that changes 500-999 lines, ignoring generated files. and removed size/L Denotes a PR that changes 100-499 lines, ignoring generated files. labels Apr 25, 2025
@anafalcao anafalcao changed the title feat(bedrock_agent): create bedrock agents functions data class feat(bedrock_agent): Add new Amazon Bedrock Agents Functions Apr 25, 2025
@anafalcao anafalcao changed the title feat(bedrock_agent): Add new Amazon Bedrock Agents Functions feat(bedrock_agent): WIP - Add new Amazon Bedrock Agents Functions Apr 25, 2025
@pull-request-size pull-request-size bot added size/L Denotes a PR that changes 100-499 lines, ignoring generated files. and removed size/XL Denotes a PR that changes 500-999 lines, ignoring generated files. labels May 1, 2025
@pull-request-size pull-request-size bot added size/XL Denotes a PR that changes 500-999 lines, ignoring generated files. and removed size/L Denotes a PR that changes 100-499 lines, ignoring generated files. labels May 2, 2025
@boring-cyborg boring-cyborg bot added the documentation Improvements or additions to documentation label May 26, 2025
Copy link
Contributor

⚠️Large PR detected⚠️

Please consider breaking into smaller PRs to avoid significant review delays. Ignore if this PR has naturally grown to this size after reviews.

@github-actions github-actions bot removed the documentation Improvements or additions to documentation label May 26, 2025
@boring-cyborg boring-cyborg bot added the documentation Improvements or additions to documentation label May 26, 2025
Copy link
Contributor

⚠️Large PR detected⚠️

Please consider breaking into smaller PRs to avoid significant review delays. Ignore if this PR has naturally grown to this size after reviews.

@github-actions github-actions bot removed the documentation Improvements or additions to documentation label May 26, 2025
@boring-cyborg boring-cyborg bot added the documentation Improvements or additions to documentation label May 26, 2025
Copy link
Contributor

⚠️Large PR detected⚠️

Please consider breaking into smaller PRs to avoid significant review delays. Ignore if this PR has naturally grown to this size after reviews.

@github-actions github-actions bot removed the documentation Improvements or additions to documentation label May 26, 2025
Copy link
Contributor

@dreamorosi dreamorosi left a comment

Choose a reason for hiding this comment

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

Left a few comments/questions

error_response = BedrockFunctionResponse(body=f"Error: {str(error)}", response_state="FAILURE")
return BedrockFunctionsResponseBuilder(error_response).build(self.current_event)

def append_context(self, **additional_context):
Copy link
Contributor

Choose a reason for hiding this comment

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

Are we ever calling this method to append the context?

Copy link
Contributor

Choose a reason for hiding this comment

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

This is a function to allow customer to inject additional data - like dependency injection - to access this within the route (tool in this case).

Copy link
Contributor

Choose a reason for hiding this comment

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

Ok, but are we ever passing the context to the tool handler?

func = self._tools[function_name]["function"]
# Filter parameters to only include those expected by the function
sig = inspect.signature(func)
valid_params = {name: value for name, value in parameters.items() if name in sig.parameters}
Copy link
Contributor

Choose a reason for hiding this comment

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

We can't parse array types, but we can "trust" number, integer, boolean and string types and potentially cast them to the correct type before passing them to the handler.

Otherwise customers will always get strings.

Copy link
Contributor

Choose a reason for hiding this comment

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

Hmm make sense, I see your point. Ok, I'll cast them before passing to the function.

@@ -26,72 +30,53 @@ Create [Agents for Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/us

**[OpenAPI schema](https://www.openapis.org/){target="_blank"}** is an industry standard JSON-serialized string that represents the structure and parameters of your API.

**Function details** consist of a list of parameters, defined by their name, [data type](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_ParameterDetail.html), and whether they are required. The agent uses these configurations to determine what information it needs to elicit from the user.

**Action group** is a collection of two resources where you define the actions that the agent should carry out: an OpenAPI schema to define the APIs that the agent can invoke to carry out its tasks, and a Lambda function to execute those actions.
Copy link
Contributor

Choose a reason for hiding this comment

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

This could be confusing, with the new feature an action group is only a function and its tool definitions, without OpenAPI schema

|----------------------|------------------------------------------------------------------|----------------------------------------------------------------|
| Definition Style | `@app.get("/path", description="")`<br>`@app.post("/path", description="")` | `@app.tool(name="")` |
| Parameter Handling | Path, query, and body parameters | Function parameters |
| Use Case | REST-like APIs, complex request/response structures | Direct function calls, simpler input/output |
Copy link
Contributor

Choose a reason for hiding this comment

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

I think simpler input is probably the most correct.

Based on tests Bedrock is able to work with complex outputs just fine even with the function-based resolver, there's just not a schema but it does fine.

| Parameter Handling | Path, query, and body parameters | Function parameters |
| Use Case | REST-like APIs, complex request/response structures | Direct function calls, simpler input/output |
| Response object | Via `BedrockResponse` | Via `BedrockFunctionResponse` |
| Best For | - Complex APIs with multiple endpoints<br>- When OpenAPI spec is required<br>- Integration with existing REST APIs | - Simple function-based actions<br>- Direct LLM-to-function mapping<br>- When function descriptions are sufficient |
Copy link
Contributor

Choose a reason for hiding this comment

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

I'd remove this When function descriptions are sufficient.

In practice, you still need to configure Bedrock and specify the tools, parameters, and description - it just happens in the Agent config rather than in the function's code.

```

#### When validation fails
??? note "What happens under the hood?"
Copy link
Contributor

Choose a reason for hiding this comment

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

Based on the content of the mermaid diagram, this should probably be under the OpenAPI section since it mentions both the OpenAPI schema and validation, which don't happen in this new implementation.

@boring-cyborg boring-cyborg bot added the documentation Improvements or additions to documentation label May 27, 2025
Copy link
Contributor

⚠️Large PR detected⚠️

Please consider breaking into smaller PRs to avoid significant review delays. Ignore if this PR has naturally grown to this size after reviews.

@github-actions github-actions bot removed the documentation Improvements or additions to documentation label May 27, 2025
@boring-cyborg boring-cyborg bot added the documentation Improvements or additions to documentation label May 28, 2025
Copy link
Contributor

⚠️Large PR detected⚠️

Please consider breaking into smaller PRs to avoid significant review delays. Ignore if this PR has naturally grown to this size after reviews.

@github-actions github-actions bot removed the documentation Improvements or additions to documentation label May 28, 2025
@boring-cyborg boring-cyborg bot added the documentation Improvements or additions to documentation label May 28, 2025
Copy link
Contributor

⚠️Large PR detected⚠️

Please consider breaking into smaller PRs to avoid significant review delays. Ignore if this PR has naturally grown to this size after reviews.

@github-actions github-actions bot removed the documentation Improvements or additions to documentation label May 28, 2025
@boring-cyborg boring-cyborg bot added the documentation Improvements or additions to documentation label May 28, 2025
Copy link
Contributor

⚠️Large PR detected⚠️

Please consider breaking into smaller PRs to avoid significant review delays. Ignore if this PR has naturally grown to this size after reviews.

@github-actions github-actions bot removed the documentation Improvements or additions to documentation label May 28, 2025
Copy link

sonarqubecloud bot commented May 28, 2025

Quality Gate Passed Quality Gate passed

Issues
0 New issues
0 Accepted issues

Measures
0 Security Hotspots
No data about Coverage
0.0% Duplication on New Code

See analysis details on SonarQube Cloud

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
event_handlers feature New feature or functionality size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files. tests
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Feature request: Amazon Bedrock Agents Functions
3 participants