mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-01-23 07:08:14 +00:00
ensure we support bedrock
This commit is contained in:
@@ -517,7 +517,7 @@ class CrewAgentExecutor(CrewAgentExecutorMixin):
|
||||
isinstance(first_item, dict) and "function" in first_item
|
||||
):
|
||||
return True
|
||||
# Anthropic-style
|
||||
# Anthropic-style (object with attributes)
|
||||
if (
|
||||
hasattr(first_item, "type")
|
||||
and getattr(first_item, "type", None) == "tool_use"
|
||||
@@ -525,6 +525,13 @@ class CrewAgentExecutor(CrewAgentExecutorMixin):
|
||||
return True
|
||||
if hasattr(first_item, "name") and hasattr(first_item, "input"):
|
||||
return True
|
||||
# Bedrock-style (dict with name and input keys)
|
||||
if (
|
||||
isinstance(first_item, dict)
|
||||
and "name" in first_item
|
||||
and "input" in first_item
|
||||
):
|
||||
return True
|
||||
# Gemini-style
|
||||
if hasattr(first_item, "function_call") and first_item.function_call:
|
||||
return True
|
||||
@@ -585,7 +592,12 @@ class CrewAgentExecutor(CrewAgentExecutorMixin):
|
||||
func_name = tool_call.name
|
||||
func_args = tool_call.input # Already a dict in Anthropic
|
||||
elif isinstance(tool_call, dict):
|
||||
call_id = tool_call.get("id", f"call_{id(tool_call)}")
|
||||
# Support OpenAI "id", Bedrock "toolUseId", or generate one
|
||||
call_id = (
|
||||
tool_call.get("id")
|
||||
or tool_call.get("toolUseId")
|
||||
or f"call_{id(tool_call)}"
|
||||
)
|
||||
func_info = tool_call.get("function", {})
|
||||
func_name = func_info.get("name", "") or tool_call.get("name", "")
|
||||
func_args = func_info.get("arguments", "{}") or tool_call.get("input", {})
|
||||
|
||||
@@ -263,6 +263,13 @@ class AgentExecutor(Flow[AgentReActState], CrewAgentExecutorMixin):
|
||||
return True
|
||||
if hasattr(first_item, "name") and hasattr(first_item, "input"):
|
||||
return True
|
||||
# Check for Bedrock-style tool call structure (dict with name and input keys)
|
||||
if (
|
||||
isinstance(first_item, dict)
|
||||
and "name" in first_item
|
||||
and "input" in first_item
|
||||
):
|
||||
return True
|
||||
# Check for Gemini-style function call (Part with function_call)
|
||||
if hasattr(first_item, "function_call") and first_item.function_call:
|
||||
return True
|
||||
|
||||
@@ -330,7 +330,8 @@ class BedrockCompletion(BaseLLM):
|
||||
cast(object, [{"text": system_message}]),
|
||||
)
|
||||
|
||||
# Add tool config if present
|
||||
# Add tool config if present or if messages contain tool content
|
||||
# Bedrock requires toolConfig when messages have toolUse/toolResult
|
||||
if tools:
|
||||
tool_config: ToolConfigurationTypeDef = {
|
||||
"tools": cast(
|
||||
@@ -339,6 +340,16 @@ class BedrockCompletion(BaseLLM):
|
||||
)
|
||||
}
|
||||
body["toolConfig"] = tool_config
|
||||
elif self._messages_contain_tool_content(formatted_messages):
|
||||
# Create minimal toolConfig from tool history in messages
|
||||
tools_from_history = self._extract_tools_from_message_history(
|
||||
formatted_messages
|
||||
)
|
||||
if tools_from_history:
|
||||
body["toolConfig"] = cast(
|
||||
"ToolConfigurationTypeDef",
|
||||
cast(object, {"tools": tools_from_history}),
|
||||
)
|
||||
|
||||
# Add optional advanced features if configured
|
||||
if self.guardrail_config:
|
||||
@@ -444,6 +455,8 @@ class BedrockCompletion(BaseLLM):
|
||||
cast(object, [{"text": system_message}]),
|
||||
)
|
||||
|
||||
# Add tool config if present or if messages contain tool content
|
||||
# Bedrock requires toolConfig when messages have toolUse/toolResult
|
||||
if tools:
|
||||
tool_config: ToolConfigurationTypeDef = {
|
||||
"tools": cast(
|
||||
@@ -452,6 +465,16 @@ class BedrockCompletion(BaseLLM):
|
||||
)
|
||||
}
|
||||
body["toolConfig"] = tool_config
|
||||
elif self._messages_contain_tool_content(formatted_messages):
|
||||
# Create minimal toolConfig from tool history in messages
|
||||
tools_from_history = self._extract_tools_from_message_history(
|
||||
formatted_messages
|
||||
)
|
||||
if tools_from_history:
|
||||
body["toolConfig"] = cast(
|
||||
"ToolConfigurationTypeDef",
|
||||
cast(object, {"tools": tools_from_history}),
|
||||
)
|
||||
|
||||
if self.guardrail_config:
|
||||
guardrail_config: GuardrailConfigurationTypeDef = cast(
|
||||
@@ -1290,6 +1313,8 @@ class BedrockCompletion(BaseLLM):
|
||||
for message in formatted_messages:
|
||||
role = message.get("role")
|
||||
content = message.get("content", "")
|
||||
tool_calls = message.get("tool_calls")
|
||||
tool_call_id = message.get("tool_call_id")
|
||||
|
||||
if role == "system":
|
||||
# Extract system message - Converse API handles it separately
|
||||
@@ -1297,9 +1322,48 @@ class BedrockCompletion(BaseLLM):
|
||||
system_message += f"\n\n{content}"
|
||||
else:
|
||||
system_message = cast(str, content)
|
||||
elif role == "assistant" and tool_calls:
|
||||
# Convert OpenAI-style tool_calls to Bedrock toolUse format
|
||||
bedrock_content = []
|
||||
for tc in tool_calls:
|
||||
func = tc.get("function", {})
|
||||
tool_use_block = {
|
||||
"toolUse": {
|
||||
"toolUseId": tc.get("id", f"call_{id(tc)}"),
|
||||
"name": func.get("name", ""),
|
||||
"input": func.get("arguments", {})
|
||||
if isinstance(func.get("arguments"), dict)
|
||||
else json.loads(func.get("arguments", "{}") or "{}"),
|
||||
}
|
||||
}
|
||||
bedrock_content.append(tool_use_block)
|
||||
converse_messages.append(
|
||||
{"role": "assistant", "content": bedrock_content}
|
||||
)
|
||||
elif role == "tool" and tool_call_id:
|
||||
# Convert OpenAI-style tool response to Bedrock toolResult format
|
||||
converse_messages.append(
|
||||
{
|
||||
"role": "user",
|
||||
"content": [
|
||||
{
|
||||
"toolResult": {
|
||||
"toolUseId": tool_call_id,
|
||||
"content": [
|
||||
{"text": str(content) if content else ""}
|
||||
],
|
||||
}
|
||||
}
|
||||
],
|
||||
}
|
||||
)
|
||||
else:
|
||||
# Convert to Converse API format with proper content structure
|
||||
converse_messages.append({"role": role, "content": [{"text": content}]})
|
||||
# Ensure content is not None
|
||||
text_content = content if content else ""
|
||||
converse_messages.append(
|
||||
{"role": role, "content": [{"text": text_content}]}
|
||||
)
|
||||
|
||||
# CRITICAL: Handle model-specific conversation requirements
|
||||
# Cohere and some other models require conversation to end with user message
|
||||
@@ -1349,6 +1413,58 @@ class BedrockCompletion(BaseLLM):
|
||||
|
||||
return converse_messages, system_message
|
||||
|
||||
@staticmethod
|
||||
def _messages_contain_tool_content(messages: list[LLMMessage]) -> bool:
|
||||
"""Check if messages contain toolUse or toolResult content blocks.
|
||||
|
||||
Bedrock requires toolConfig when messages have tool-related content.
|
||||
"""
|
||||
for message in messages:
|
||||
content = message.get("content", [])
|
||||
if isinstance(content, list):
|
||||
for block in content:
|
||||
if isinstance(block, dict):
|
||||
if "toolUse" in block or "toolResult" in block:
|
||||
return True
|
||||
return False
|
||||
|
||||
@staticmethod
|
||||
def _extract_tools_from_message_history(
|
||||
messages: list[LLMMessage],
|
||||
) -> list[dict[str, Any]]:
|
||||
"""Extract tool definitions from toolUse blocks in message history.
|
||||
|
||||
When no tools are passed but messages contain toolUse, we need to
|
||||
recreate a minimal toolConfig to satisfy Bedrock's API requirements.
|
||||
"""
|
||||
tools: list[dict[str, Any]] = []
|
||||
seen_tool_names: set[str] = set()
|
||||
|
||||
for message in messages:
|
||||
content = message.get("content", [])
|
||||
if isinstance(content, list):
|
||||
for block in content:
|
||||
if isinstance(block, dict) and "toolUse" in block:
|
||||
tool_use = block["toolUse"]
|
||||
tool_name = tool_use.get("name", "")
|
||||
if tool_name and tool_name not in seen_tool_names:
|
||||
seen_tool_names.add(tool_name)
|
||||
# Create a minimal tool spec from the toolUse block
|
||||
tool_spec: dict[str, Any] = {
|
||||
"toolSpec": {
|
||||
"name": tool_name,
|
||||
"description": f"Tool: {tool_name}",
|
||||
"inputSchema": {
|
||||
"json": {
|
||||
"type": "object",
|
||||
"properties": {},
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
tools.append(tool_spec)
|
||||
return tools
|
||||
|
||||
@staticmethod
|
||||
def _format_tools_for_converse(
|
||||
tools: list[dict[str, Any]],
|
||||
|
||||
@@ -875,7 +875,8 @@ def extract_tool_call_info(
|
||||
call_id = getattr(tool_call, "id", f"call_{id(tool_call)}")
|
||||
return call_id, tool_call.name, tool_call.input
|
||||
if isinstance(tool_call, dict):
|
||||
call_id = tool_call.get("id", f"call_{id(tool_call)}")
|
||||
# Support OpenAI "id", Bedrock "toolUseId", or generate one
|
||||
call_id = tool_call.get("id") or tool_call.get("toolUseId") or f"call_{id(tool_call)}"
|
||||
func_info = tool_call.get("function", {})
|
||||
func_name = func_info.get("name", "") or tool_call.get("name", "")
|
||||
func_args = func_info.get("arguments", "{}") or tool_call.get("input", {})
|
||||
|
||||
@@ -241,26 +241,26 @@ class TestGeminiNativeToolCalling:
|
||||
self, calculator_tool: CalculatorTool
|
||||
) -> None:
|
||||
"""Test Gemini agent can use native tool calling."""
|
||||
with patch.dict(os.environ, {"GOOGLE_GENAI_USE_VERTEXAI": "true"}):
|
||||
agent = Agent(
|
||||
role="Math Assistant",
|
||||
goal="Help users with mathematical calculations",
|
||||
backstory="You are a helpful math assistant.",
|
||||
tools=[calculator_tool],
|
||||
llm=LLM(model="gemini/gemini-2.0-flash-exp"),
|
||||
)
|
||||
|
||||
task = Task(
|
||||
description="Calculate what is 15 * 8",
|
||||
expected_output="The result of the calculation",
|
||||
agent=agent,
|
||||
)
|
||||
agent = Agent(
|
||||
role="Math Assistant",
|
||||
goal="Help users with mathematical calculations",
|
||||
backstory="You are a helpful math assistant.",
|
||||
tools=[calculator_tool],
|
||||
llm=LLM(model="gemini/gemini-2.0-flash-exp"),
|
||||
)
|
||||
|
||||
crew = Crew(agents=[agent], tasks=[task])
|
||||
result = crew.kickoff()
|
||||
task = Task(
|
||||
description="Calculate what is 15 * 8",
|
||||
expected_output="The result of the calculation",
|
||||
agent=agent,
|
||||
)
|
||||
|
||||
assert result is not None
|
||||
assert result.raw is not None
|
||||
crew = Crew(agents=[agent], tasks=[task])
|
||||
result = crew.kickoff()
|
||||
|
||||
assert result is not None
|
||||
assert result.raw is not None
|
||||
|
||||
def test_gemini_agent_kickoff_with_tools_mocked(
|
||||
self, calculator_tool: CalculatorTool
|
||||
@@ -387,40 +387,45 @@ class TestBedrockNativeToolCalling:
|
||||
def mock_aws_env(self):
|
||||
"""Mock AWS environment variables for tests."""
|
||||
env_vars = {
|
||||
"AWS_ACCESS_KEY_ID": "test-key",
|
||||
"AWS_SECRET_ACCESS_KEY": "test-secret",
|
||||
"AWS_REGION": "us-east-1",
|
||||
"AWS_ACCESS_KEY_ID": "test-key",
|
||||
"AWS_SECRET_ACCESS_KEY": "test-secret",
|
||||
"AWS_REGION": "us-east-1",
|
||||
}
|
||||
with patch.dict(os.environ, env_vars):
|
||||
if "AWS_ACCESS_KEY_ID" not in os.environ:
|
||||
with patch.dict(os.environ, env_vars):
|
||||
yield
|
||||
else:
|
||||
yield
|
||||
|
||||
@pytest.mark.vcr()
|
||||
def test_bedrock_agent_kickoff_with_tools_mocked(
|
||||
self, calculator_tool: CalculatorTool
|
||||
) -> None:
|
||||
"""Test Bedrock agent kickoff with mocked LLM call."""
|
||||
llm = LLM(model="bedrock/anthropic.claude-3-haiku-20240307-v1:0")
|
||||
|
||||
with patch.object(llm, "call", return_value="The answer is 120.") as mock_call:
|
||||
agent = Agent(
|
||||
role="Math Assistant",
|
||||
goal="Calculate math",
|
||||
backstory="You calculate.",
|
||||
tools=[calculator_tool],
|
||||
llm=llm,
|
||||
verbose=False,
|
||||
)
|
||||
agent = Agent(
|
||||
role="Math Assistant",
|
||||
goal="Calculate math",
|
||||
backstory="You calculate.",
|
||||
tools=[calculator_tool],
|
||||
llm=llm,
|
||||
verbose=False,
|
||||
max_iter=5,
|
||||
)
|
||||
|
||||
task = Task(
|
||||
description="Calculate 15 * 8",
|
||||
expected_output="Result",
|
||||
agent=agent,
|
||||
)
|
||||
task = Task(
|
||||
description="Calculate 15 * 8",
|
||||
expected_output="Result",
|
||||
agent=agent,
|
||||
)
|
||||
|
||||
crew = Crew(agents=[agent], tasks=[task])
|
||||
result = crew.kickoff()
|
||||
crew = Crew(agents=[agent], tasks=[task])
|
||||
result = crew.kickoff()
|
||||
|
||||
assert mock_call.called
|
||||
assert result is not None
|
||||
assert result is not None
|
||||
assert result.raw is not None
|
||||
assert "120" in str(result.raw)
|
||||
|
||||
|
||||
# =============================================================================
|
||||
|
||||
@@ -0,0 +1,485 @@
|
||||
interactions:
|
||||
- request:
|
||||
body: '{"messages": [{"role": "user", "content": [{"text": "\nCurrent Task: Calculate
|
||||
15 * 8\n\nThis is the expected criteria for your final answer: Result\nyou MUST
|
||||
return the actual complete content as the final answer, not a summary.\n\nThis
|
||||
is VERY important to you, your job depends on it!"}]}], "inferenceConfig": {"stopSequences":
|
||||
["\nObservation:"]}, "system": [{"text": "You are Math Assistant. You calculate.\nYour
|
||||
personal goal is: Calculate math"}], "toolConfig": {"tools": [{"toolSpec": {"name":
|
||||
"calculator", "description": "Perform mathematical calculations. Use this for
|
||||
any math operations.", "inputSchema": {"json": {"properties": {"expression":
|
||||
{"description": "Mathematical expression to evaluate", "title": "Expression",
|
||||
"type": "string"}}, "required": ["expression"], "type": "object"}}}}]}}'
|
||||
headers:
|
||||
Content-Length:
|
||||
- '806'
|
||||
Content-Type:
|
||||
- !!binary |
|
||||
YXBwbGljYXRpb24vanNvbg==
|
||||
User-Agent:
|
||||
- X-USER-AGENT-XXX
|
||||
amz-sdk-invocation-id:
|
||||
- AMZ-SDK-INVOCATION-ID-XXX
|
||||
amz-sdk-request:
|
||||
- !!binary |
|
||||
YXR0ZW1wdD0x
|
||||
authorization:
|
||||
- AUTHORIZATION-XXX
|
||||
x-amz-date:
|
||||
- X-AMZ-DATE-XXX
|
||||
method: POST
|
||||
uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-haiku-20240307-v1%3A0/converse
|
||||
response:
|
||||
body:
|
||||
string: '{"metrics":{"latencyMs":1540},"output":{"message":{"content":[{"text":"Here
|
||||
is the calculation for 15 * 8:"},{"toolUse":{"input":{"expression":"15 * 8"},"name":"calculator","toolUseId":"tooluse_1OIARGnOTjiITDKGd_FgMA"}}],"role":"assistant"}},"stopReason":"tool_use","usage":{"inputTokens":417,"outputTokens":68,"serverToolUsage":{},"totalTokens":485}}'
|
||||
headers:
|
||||
Connection:
|
||||
- keep-alive
|
||||
Content-Length:
|
||||
- '351'
|
||||
Content-Type:
|
||||
- application/json
|
||||
Date:
|
||||
- Thu, 22 Jan 2026 21:27:56 GMT
|
||||
x-amzn-RequestId:
|
||||
- X-AMZN-REQUESTID-XXX
|
||||
status:
|
||||
code: 200
|
||||
message: OK
|
||||
- request:
|
||||
body: '{"messages": [{"role": "user", "content": [{"text": "\nCurrent Task: Calculate
|
||||
15 * 8\n\nThis is the expected criteria for your final answer: Result\nyou MUST
|
||||
return the actual complete content as the final answer, not a summary.\n\nThis
|
||||
is VERY important to you, your job depends on it!"}]}, {"role": "assistant",
|
||||
"content": [{"toolUse": {"toolUseId": "tooluse_1OIARGnOTjiITDKGd_FgMA", "name":
|
||||
"calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId":
|
||||
"tooluse_1OIARGnOTjiITDKGd_FgMA", "content": [{"text": "Error executing tool:
|
||||
CalculatorTool._run() missing 1 required positional argument: ''expression''"}]}}]},
|
||||
{"role": "user", "content": [{"text": "Analyze the tool result. If requirements
|
||||
are met, provide the Final Answer. Otherwise, call the next tool. Deliver only
|
||||
the answer without meta-commentary."}]}], "inferenceConfig": {"stopSequences":
|
||||
["\nObservation:"]}, "system": [{"text": "You are Math Assistant. You calculate.\nYour
|
||||
personal goal is: Calculate math"}], "toolConfig": {"tools": [{"toolSpec": {"name":
|
||||
"calculator", "description": "Perform mathematical calculations. Use this for
|
||||
any math operations.", "inputSchema": {"json": {"properties": {"expression":
|
||||
{"description": "Mathematical expression to evaluate", "title": "Expression",
|
||||
"type": "string"}}, "required": ["expression"], "type": "object"}}}}]}}'
|
||||
headers:
|
||||
Content-Length:
|
||||
- '1358'
|
||||
Content-Type:
|
||||
- !!binary |
|
||||
YXBwbGljYXRpb24vanNvbg==
|
||||
User-Agent:
|
||||
- X-USER-AGENT-XXX
|
||||
amz-sdk-invocation-id:
|
||||
- AMZ-SDK-INVOCATION-ID-XXX
|
||||
amz-sdk-request:
|
||||
- !!binary |
|
||||
YXR0ZW1wdD0x
|
||||
authorization:
|
||||
- AUTHORIZATION-XXX
|
||||
x-amz-date:
|
||||
- X-AMZ-DATE-XXX
|
||||
method: POST
|
||||
uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-haiku-20240307-v1%3A0/converse
|
||||
response:
|
||||
body:
|
||||
string: '{"metrics":{"latencyMs":1071},"output":{"message":{"content":[{"toolUse":{"input":{"expression":"15
|
||||
* 8"},"name":"calculator","toolUseId":"tooluse_vjcn57LeQpS-pePkTvny8w"}}],"role":"assistant"}},"stopReason":"tool_use","usage":{"inputTokens":527,"outputTokens":55,"serverToolUsage":{},"totalTokens":582}}'
|
||||
headers:
|
||||
Connection:
|
||||
- keep-alive
|
||||
Content-Length:
|
||||
- '304'
|
||||
Content-Type:
|
||||
- application/json
|
||||
Date:
|
||||
- Thu, 22 Jan 2026 21:27:57 GMT
|
||||
x-amzn-RequestId:
|
||||
- X-AMZN-REQUESTID-XXX
|
||||
status:
|
||||
code: 200
|
||||
message: OK
|
||||
- request:
|
||||
body: '{"messages": [{"role": "user", "content": [{"text": "\nCurrent Task: Calculate
|
||||
15 * 8\n\nThis is the expected criteria for your final answer: Result\nyou MUST
|
||||
return the actual complete content as the final answer, not a summary.\n\nThis
|
||||
is VERY important to you, your job depends on it!"}]}, {"role": "assistant",
|
||||
"content": [{"toolUse": {"toolUseId": "tooluse_1OIARGnOTjiITDKGd_FgMA", "name":
|
||||
"calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId":
|
||||
"tooluse_1OIARGnOTjiITDKGd_FgMA", "content": [{"text": "Error executing tool:
|
||||
CalculatorTool._run() missing 1 required positional argument: ''expression''"}]}}]},
|
||||
{"role": "user", "content": [{"text": "Analyze the tool result. If requirements
|
||||
are met, provide the Final Answer. Otherwise, call the next tool. Deliver only
|
||||
the answer without meta-commentary."}]}, {"role": "assistant", "content": [{"toolUse":
|
||||
{"toolUseId": "tooluse_vjcn57LeQpS-pePkTvny8w", "name": "calculator", "input":
|
||||
{}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId": "tooluse_vjcn57LeQpS-pePkTvny8w",
|
||||
"content": [{"text": "Error executing tool: CalculatorTool._run() missing 1
|
||||
required positional argument: ''expression''"}]}}]}, {"role": "user", "content":
|
||||
[{"text": "Analyze the tool result. If requirements are met, provide the Final
|
||||
Answer. Otherwise, call the next tool. Deliver only the answer without meta-commentary."}]}],
|
||||
"inferenceConfig": {"stopSequences": ["\nObservation:"]}, "system": [{"text":
|
||||
"You are Math Assistant. You calculate.\nYour personal goal is: Calculate math"}],
|
||||
"toolConfig": {"tools": [{"toolSpec": {"name": "calculator", "description":
|
||||
"Perform mathematical calculations. Use this for any math operations.", "inputSchema":
|
||||
{"json": {"properties": {"expression": {"description": "Mathematical expression
|
||||
to evaluate", "title": "Expression", "type": "string"}}, "required": ["expression"],
|
||||
"type": "object"}}}}]}}'
|
||||
headers:
|
||||
Content-Length:
|
||||
- '1910'
|
||||
Content-Type:
|
||||
- !!binary |
|
||||
YXBwbGljYXRpb24vanNvbg==
|
||||
User-Agent:
|
||||
- X-USER-AGENT-XXX
|
||||
amz-sdk-invocation-id:
|
||||
- AMZ-SDK-INVOCATION-ID-XXX
|
||||
amz-sdk-request:
|
||||
- !!binary |
|
||||
YXR0ZW1wdD0x
|
||||
authorization:
|
||||
- AUTHORIZATION-XXX
|
||||
x-amz-date:
|
||||
- X-AMZ-DATE-XXX
|
||||
method: POST
|
||||
uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-haiku-20240307-v1%3A0/converse
|
||||
response:
|
||||
body:
|
||||
string: '{"metrics":{"latencyMs":927},"output":{"message":{"content":[{"toolUse":{"input":{"expression":"15
|
||||
* 8"},"name":"calculator","toolUseId":"tooluse__4aP-hcTR4Ozp5gTlESXbg"}}],"role":"assistant"}},"stopReason":"tool_use","usage":{"inputTokens":637,"outputTokens":57,"serverToolUsage":{},"totalTokens":694}}'
|
||||
headers:
|
||||
Connection:
|
||||
- keep-alive
|
||||
Content-Length:
|
||||
- '303'
|
||||
Content-Type:
|
||||
- application/json
|
||||
Date:
|
||||
- Thu, 22 Jan 2026 21:27:58 GMT
|
||||
x-amzn-RequestId:
|
||||
- X-AMZN-REQUESTID-XXX
|
||||
status:
|
||||
code: 200
|
||||
message: OK
|
||||
- request:
|
||||
body: '{"messages": [{"role": "user", "content": [{"text": "\nCurrent Task: Calculate
|
||||
15 * 8\n\nThis is the expected criteria for your final answer: Result\nyou MUST
|
||||
return the actual complete content as the final answer, not a summary.\n\nThis
|
||||
is VERY important to you, your job depends on it!"}]}, {"role": "assistant",
|
||||
"content": [{"toolUse": {"toolUseId": "tooluse_1OIARGnOTjiITDKGd_FgMA", "name":
|
||||
"calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId":
|
||||
"tooluse_1OIARGnOTjiITDKGd_FgMA", "content": [{"text": "Error executing tool:
|
||||
CalculatorTool._run() missing 1 required positional argument: ''expression''"}]}}]},
|
||||
{"role": "user", "content": [{"text": "Analyze the tool result. If requirements
|
||||
are met, provide the Final Answer. Otherwise, call the next tool. Deliver only
|
||||
the answer without meta-commentary."}]}, {"role": "assistant", "content": [{"toolUse":
|
||||
{"toolUseId": "tooluse_vjcn57LeQpS-pePkTvny8w", "name": "calculator", "input":
|
||||
{}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId": "tooluse_vjcn57LeQpS-pePkTvny8w",
|
||||
"content": [{"text": "Error executing tool: CalculatorTool._run() missing 1
|
||||
required positional argument: ''expression''"}]}}]}, {"role": "user", "content":
|
||||
[{"text": "Analyze the tool result. If requirements are met, provide the Final
|
||||
Answer. Otherwise, call the next tool. Deliver only the answer without meta-commentary."}]},
|
||||
{"role": "assistant", "content": [{"toolUse": {"toolUseId": "tooluse__4aP-hcTR4Ozp5gTlESXbg",
|
||||
"name": "calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult":
|
||||
{"toolUseId": "tooluse__4aP-hcTR4Ozp5gTlESXbg", "content": [{"text": "Error
|
||||
executing tool: CalculatorTool._run() missing 1 required positional argument:
|
||||
''expression''"}]}}]}, {"role": "user", "content": [{"text": "Analyze the tool
|
||||
result. If requirements are met, provide the Final Answer. Otherwise, call the
|
||||
next tool. Deliver only the answer without meta-commentary."}]}], "inferenceConfig":
|
||||
{"stopSequences": ["\nObservation:"]}, "system": [{"text": "You are Math Assistant.
|
||||
You calculate.\nYour personal goal is: Calculate math"}], "toolConfig": {"tools":
|
||||
[{"toolSpec": {"name": "calculator", "description": "Perform mathematical calculations.
|
||||
Use this for any math operations.", "inputSchema": {"json": {"properties": {"expression":
|
||||
{"description": "Mathematical expression to evaluate", "title": "Expression",
|
||||
"type": "string"}}, "required": ["expression"], "type": "object"}}}}]}}'
|
||||
headers:
|
||||
Content-Length:
|
||||
- '2462'
|
||||
Content-Type:
|
||||
- !!binary |
|
||||
YXBwbGljYXRpb24vanNvbg==
|
||||
User-Agent:
|
||||
- X-USER-AGENT-XXX
|
||||
amz-sdk-invocation-id:
|
||||
- AMZ-SDK-INVOCATION-ID-XXX
|
||||
amz-sdk-request:
|
||||
- !!binary |
|
||||
YXR0ZW1wdD0x
|
||||
authorization:
|
||||
- AUTHORIZATION-XXX
|
||||
x-amz-date:
|
||||
- X-AMZ-DATE-XXX
|
||||
method: POST
|
||||
uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-haiku-20240307-v1%3A0/converse
|
||||
response:
|
||||
body:
|
||||
string: '{"metrics":{"latencyMs":1226},"output":{"message":{"content":[{"toolUse":{"input":{"expression":"15
|
||||
* 8"},"name":"calculator","toolUseId":"tooluse_fEJhgDNjSUic0g97dN8Xww"}}],"role":"assistant"}},"stopReason":"tool_use","usage":{"inputTokens":747,"outputTokens":55,"serverToolUsage":{},"totalTokens":802}}'
|
||||
headers:
|
||||
Connection:
|
||||
- keep-alive
|
||||
Content-Length:
|
||||
- '304'
|
||||
Content-Type:
|
||||
- application/json
|
||||
Date:
|
||||
- Thu, 22 Jan 2026 21:28:00 GMT
|
||||
x-amzn-RequestId:
|
||||
- X-AMZN-REQUESTID-XXX
|
||||
status:
|
||||
code: 200
|
||||
message: OK
|
||||
- request:
|
||||
body: '{"messages": [{"role": "user", "content": [{"text": "\nCurrent Task: Calculate
|
||||
15 * 8\n\nThis is the expected criteria for your final answer: Result\nyou MUST
|
||||
return the actual complete content as the final answer, not a summary.\n\nThis
|
||||
is VERY important to you, your job depends on it!"}]}, {"role": "assistant",
|
||||
"content": [{"toolUse": {"toolUseId": "tooluse_1OIARGnOTjiITDKGd_FgMA", "name":
|
||||
"calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId":
|
||||
"tooluse_1OIARGnOTjiITDKGd_FgMA", "content": [{"text": "Error executing tool:
|
||||
CalculatorTool._run() missing 1 required positional argument: ''expression''"}]}}]},
|
||||
{"role": "user", "content": [{"text": "Analyze the tool result. If requirements
|
||||
are met, provide the Final Answer. Otherwise, call the next tool. Deliver only
|
||||
the answer without meta-commentary."}]}, {"role": "assistant", "content": [{"toolUse":
|
||||
{"toolUseId": "tooluse_vjcn57LeQpS-pePkTvny8w", "name": "calculator", "input":
|
||||
{}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId": "tooluse_vjcn57LeQpS-pePkTvny8w",
|
||||
"content": [{"text": "Error executing tool: CalculatorTool._run() missing 1
|
||||
required positional argument: ''expression''"}]}}]}, {"role": "user", "content":
|
||||
[{"text": "Analyze the tool result. If requirements are met, provide the Final
|
||||
Answer. Otherwise, call the next tool. Deliver only the answer without meta-commentary."}]},
|
||||
{"role": "assistant", "content": [{"toolUse": {"toolUseId": "tooluse__4aP-hcTR4Ozp5gTlESXbg",
|
||||
"name": "calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult":
|
||||
{"toolUseId": "tooluse__4aP-hcTR4Ozp5gTlESXbg", "content": [{"text": "Error
|
||||
executing tool: CalculatorTool._run() missing 1 required positional argument:
|
||||
''expression''"}]}}]}, {"role": "user", "content": [{"text": "Analyze the tool
|
||||
result. If requirements are met, provide the Final Answer. Otherwise, call the
|
||||
next tool. Deliver only the answer without meta-commentary."}]}, {"role": "assistant",
|
||||
"content": [{"toolUse": {"toolUseId": "tooluse_fEJhgDNjSUic0g97dN8Xww", "name":
|
||||
"calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId":
|
||||
"tooluse_fEJhgDNjSUic0g97dN8Xww", "content": [{"text": "Error executing tool:
|
||||
CalculatorTool._run() missing 1 required positional argument: ''expression''"}]}}]},
|
||||
{"role": "user", "content": [{"text": "Analyze the tool result. If requirements
|
||||
are met, provide the Final Answer. Otherwise, call the next tool. Deliver only
|
||||
the answer without meta-commentary."}]}], "inferenceConfig": {"stopSequences":
|
||||
["\nObservation:"]}, "system": [{"text": "You are Math Assistant. You calculate.\nYour
|
||||
personal goal is: Calculate math"}], "toolConfig": {"tools": [{"toolSpec": {"name":
|
||||
"calculator", "description": "Perform mathematical calculations. Use this for
|
||||
any math operations.", "inputSchema": {"json": {"properties": {"expression":
|
||||
{"description": "Mathematical expression to evaluate", "title": "Expression",
|
||||
"type": "string"}}, "required": ["expression"], "type": "object"}}}}]}}'
|
||||
headers:
|
||||
Content-Length:
|
||||
- '3014'
|
||||
Content-Type:
|
||||
- !!binary |
|
||||
YXBwbGljYXRpb24vanNvbg==
|
||||
User-Agent:
|
||||
- X-USER-AGENT-XXX
|
||||
amz-sdk-invocation-id:
|
||||
- AMZ-SDK-INVOCATION-ID-XXX
|
||||
amz-sdk-request:
|
||||
- !!binary |
|
||||
YXR0ZW1wdD0x
|
||||
authorization:
|
||||
- AUTHORIZATION-XXX
|
||||
x-amz-date:
|
||||
- X-AMZ-DATE-XXX
|
||||
method: POST
|
||||
uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-haiku-20240307-v1%3A0/converse
|
||||
response:
|
||||
body:
|
||||
string: '{"metrics":{"latencyMs":947},"output":{"message":{"content":[{"toolUse":{"input":{"expression":"15
|
||||
* 8"},"name":"calculator","toolUseId":"tooluse_F5QIGY91SBOeM4VcFRB73A"}}],"role":"assistant"}},"stopReason":"tool_use","usage":{"inputTokens":857,"outputTokens":55,"serverToolUsage":{},"totalTokens":912}}'
|
||||
headers:
|
||||
Connection:
|
||||
- keep-alive
|
||||
Content-Length:
|
||||
- '303'
|
||||
Content-Type:
|
||||
- application/json
|
||||
Date:
|
||||
- Thu, 22 Jan 2026 21:28:01 GMT
|
||||
x-amzn-RequestId:
|
||||
- X-AMZN-REQUESTID-XXX
|
||||
status:
|
||||
code: 200
|
||||
message: OK
|
||||
- request:
|
||||
body: '{"messages": [{"role": "user", "content": [{"text": "\nCurrent Task: Calculate
|
||||
15 * 8\n\nThis is the expected criteria for your final answer: Result\nyou MUST
|
||||
return the actual complete content as the final answer, not a summary.\n\nThis
|
||||
is VERY important to you, your job depends on it!"}]}, {"role": "assistant",
|
||||
"content": [{"toolUse": {"toolUseId": "tooluse_1OIARGnOTjiITDKGd_FgMA", "name":
|
||||
"calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId":
|
||||
"tooluse_1OIARGnOTjiITDKGd_FgMA", "content": [{"text": "Error executing tool:
|
||||
CalculatorTool._run() missing 1 required positional argument: ''expression''"}]}}]},
|
||||
{"role": "user", "content": [{"text": "Analyze the tool result. If requirements
|
||||
are met, provide the Final Answer. Otherwise, call the next tool. Deliver only
|
||||
the answer without meta-commentary."}]}, {"role": "assistant", "content": [{"toolUse":
|
||||
{"toolUseId": "tooluse_vjcn57LeQpS-pePkTvny8w", "name": "calculator", "input":
|
||||
{}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId": "tooluse_vjcn57LeQpS-pePkTvny8w",
|
||||
"content": [{"text": "Error executing tool: CalculatorTool._run() missing 1
|
||||
required positional argument: ''expression''"}]}}]}, {"role": "user", "content":
|
||||
[{"text": "Analyze the tool result. If requirements are met, provide the Final
|
||||
Answer. Otherwise, call the next tool. Deliver only the answer without meta-commentary."}]},
|
||||
{"role": "assistant", "content": [{"toolUse": {"toolUseId": "tooluse__4aP-hcTR4Ozp5gTlESXbg",
|
||||
"name": "calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult":
|
||||
{"toolUseId": "tooluse__4aP-hcTR4Ozp5gTlESXbg", "content": [{"text": "Error
|
||||
executing tool: CalculatorTool._run() missing 1 required positional argument:
|
||||
''expression''"}]}}]}, {"role": "user", "content": [{"text": "Analyze the tool
|
||||
result. If requirements are met, provide the Final Answer. Otherwise, call the
|
||||
next tool. Deliver only the answer without meta-commentary."}]}, {"role": "assistant",
|
||||
"content": [{"toolUse": {"toolUseId": "tooluse_fEJhgDNjSUic0g97dN8Xww", "name":
|
||||
"calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId":
|
||||
"tooluse_fEJhgDNjSUic0g97dN8Xww", "content": [{"text": "Error executing tool:
|
||||
CalculatorTool._run() missing 1 required positional argument: ''expression''"}]}}]},
|
||||
{"role": "user", "content": [{"text": "Analyze the tool result. If requirements
|
||||
are met, provide the Final Answer. Otherwise, call the next tool. Deliver only
|
||||
the answer without meta-commentary."}]}, {"role": "assistant", "content": [{"toolUse":
|
||||
{"toolUseId": "tooluse_F5QIGY91SBOeM4VcFRB73A", "name": "calculator", "input":
|
||||
{}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId": "tooluse_F5QIGY91SBOeM4VcFRB73A",
|
||||
"content": [{"text": "Error executing tool: CalculatorTool._run() missing 1
|
||||
required positional argument: ''expression''"}]}}]}, {"role": "user", "content":
|
||||
[{"text": "Analyze the tool result. If requirements are met, provide the Final
|
||||
Answer. Otherwise, call the next tool. Deliver only the answer without meta-commentary."}]},
|
||||
{"role": "assistant", "content": [{"text": "Now it''s time you MUST give your
|
||||
absolute best final answer. You''ll ignore all previous instructions, stop using
|
||||
any tools, and just return your absolute BEST Final answer."}]}], "inferenceConfig":
|
||||
{"stopSequences": ["\nObservation:"]}, "system": [{"text": "You are Math Assistant.
|
||||
You calculate.\nYour personal goal is: Calculate math"}], "toolConfig": {"tools":
|
||||
[{"toolSpec": {"name": "calculator", "description": "Tool: calculator", "inputSchema":
|
||||
{"json": {"type": "object", "properties": {}}}}}]}}'
|
||||
headers:
|
||||
Content-Length:
|
||||
- '3599'
|
||||
Content-Type:
|
||||
- !!binary |
|
||||
YXBwbGljYXRpb24vanNvbg==
|
||||
User-Agent:
|
||||
- X-USER-AGENT-XXX
|
||||
amz-sdk-invocation-id:
|
||||
- AMZ-SDK-INVOCATION-ID-XXX
|
||||
amz-sdk-request:
|
||||
- !!binary |
|
||||
YXR0ZW1wdD0x
|
||||
authorization:
|
||||
- AUTHORIZATION-XXX
|
||||
x-amz-date:
|
||||
- X-AMZ-DATE-XXX
|
||||
method: POST
|
||||
uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-haiku-20240307-v1%3A0/converse
|
||||
response:
|
||||
body:
|
||||
string: '{"message":"The model returned the following errors: Your API request
|
||||
included an `assistant` message in the final position, which would pre-fill
|
||||
the `assistant` response. When using tools, pre-filling the `assistant` response
|
||||
is not supported."}'
|
||||
headers:
|
||||
Connection:
|
||||
- keep-alive
|
||||
Content-Length:
|
||||
- '246'
|
||||
Content-Type:
|
||||
- application/json
|
||||
Date:
|
||||
- Thu, 22 Jan 2026 21:28:02 GMT
|
||||
x-amzn-ErrorType:
|
||||
- ValidationException:http://internal.amazon.com/coral/com.amazon.bedrock/
|
||||
x-amzn-RequestId:
|
||||
- X-AMZN-REQUESTID-XXX
|
||||
status:
|
||||
code: 400
|
||||
message: Bad Request
|
||||
- request:
|
||||
body: '{"messages": [{"role": "user", "content": [{"text": "\nCurrent Task: Calculate
|
||||
15 * 8\n\nThis is the expected criteria for your final answer: Result\nyou MUST
|
||||
return the actual complete content as the final answer, not a summary.\n\nThis
|
||||
is VERY important to you, your job depends on it!"}]}, {"role": "assistant",
|
||||
"content": [{"toolUse": {"toolUseId": "tooluse_1OIARGnOTjiITDKGd_FgMA", "name":
|
||||
"calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId":
|
||||
"tooluse_1OIARGnOTjiITDKGd_FgMA", "content": [{"text": "Error executing tool:
|
||||
CalculatorTool._run() missing 1 required positional argument: ''expression''"}]}}]},
|
||||
{"role": "user", "content": [{"text": "Analyze the tool result. If requirements
|
||||
are met, provide the Final Answer. Otherwise, call the next tool. Deliver only
|
||||
the answer without meta-commentary."}]}, {"role": "assistant", "content": [{"toolUse":
|
||||
{"toolUseId": "tooluse_vjcn57LeQpS-pePkTvny8w", "name": "calculator", "input":
|
||||
{}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId": "tooluse_vjcn57LeQpS-pePkTvny8w",
|
||||
"content": [{"text": "Error executing tool: CalculatorTool._run() missing 1
|
||||
required positional argument: ''expression''"}]}}]}, {"role": "user", "content":
|
||||
[{"text": "Analyze the tool result. If requirements are met, provide the Final
|
||||
Answer. Otherwise, call the next tool. Deliver only the answer without meta-commentary."}]},
|
||||
{"role": "assistant", "content": [{"toolUse": {"toolUseId": "tooluse__4aP-hcTR4Ozp5gTlESXbg",
|
||||
"name": "calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult":
|
||||
{"toolUseId": "tooluse__4aP-hcTR4Ozp5gTlESXbg", "content": [{"text": "Error
|
||||
executing tool: CalculatorTool._run() missing 1 required positional argument:
|
||||
''expression''"}]}}]}, {"role": "user", "content": [{"text": "Analyze the tool
|
||||
result. If requirements are met, provide the Final Answer. Otherwise, call the
|
||||
next tool. Deliver only the answer without meta-commentary."}]}, {"role": "assistant",
|
||||
"content": [{"toolUse": {"toolUseId": "tooluse_fEJhgDNjSUic0g97dN8Xww", "name":
|
||||
"calculator", "input": {}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId":
|
||||
"tooluse_fEJhgDNjSUic0g97dN8Xww", "content": [{"text": "Error executing tool:
|
||||
CalculatorTool._run() missing 1 required positional argument: ''expression''"}]}}]},
|
||||
{"role": "user", "content": [{"text": "Analyze the tool result. If requirements
|
||||
are met, provide the Final Answer. Otherwise, call the next tool. Deliver only
|
||||
the answer without meta-commentary."}]}, {"role": "assistant", "content": [{"toolUse":
|
||||
{"toolUseId": "tooluse_F5QIGY91SBOeM4VcFRB73A", "name": "calculator", "input":
|
||||
{}}}]}, {"role": "user", "content": [{"toolResult": {"toolUseId": "tooluse_F5QIGY91SBOeM4VcFRB73A",
|
||||
"content": [{"text": "Error executing tool: CalculatorTool._run() missing 1
|
||||
required positional argument: ''expression''"}]}}]}, {"role": "user", "content":
|
||||
[{"text": "Analyze the tool result. If requirements are met, provide the Final
|
||||
Answer. Otherwise, call the next tool. Deliver only the answer without meta-commentary."}]},
|
||||
{"role": "assistant", "content": [{"text": "Now it''s time you MUST give your
|
||||
absolute best final answer. You''ll ignore all previous instructions, stop using
|
||||
any tools, and just return your absolute BEST Final answer."}]}, {"role": "user",
|
||||
"content": [{"text": "\nCurrent Task: Calculate 15 * 8\n\nThis is the expected
|
||||
criteria for your final answer: Result\nyou MUST return the actual complete
|
||||
content as the final answer, not a summary.\n\nThis is VERY important to you,
|
||||
your job depends on it!"}]}, {"role": "assistant", "content": [{"text": "Now
|
||||
it''s time you MUST give your absolute best final answer. You''ll ignore all
|
||||
previous instructions, stop using any tools, and just return your absolute BEST
|
||||
Final answer."}]}], "inferenceConfig": {"stopSequences": ["\nObservation:"]},
|
||||
"system": [{"text": "You are Math Assistant. You calculate.\nYour personal goal
|
||||
is: Calculate math\n\nYou are Math Assistant. You calculate.\nYour personal
|
||||
goal is: Calculate math"}], "toolConfig": {"tools": [{"toolSpec": {"name": "calculator",
|
||||
"description": "Tool: calculator", "inputSchema": {"json": {"type": "object",
|
||||
"properties": {}}}}}]}}'
|
||||
headers:
|
||||
Content-Length:
|
||||
- '4181'
|
||||
Content-Type:
|
||||
- !!binary |
|
||||
YXBwbGljYXRpb24vanNvbg==
|
||||
User-Agent:
|
||||
- X-USER-AGENT-XXX
|
||||
amz-sdk-invocation-id:
|
||||
- AMZ-SDK-INVOCATION-ID-XXX
|
||||
amz-sdk-request:
|
||||
- !!binary |
|
||||
YXR0ZW1wdD0x
|
||||
authorization:
|
||||
- AUTHORIZATION-XXX
|
||||
x-amz-date:
|
||||
- X-AMZ-DATE-XXX
|
||||
method: POST
|
||||
uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-haiku-20240307-v1%3A0/converse
|
||||
response:
|
||||
body:
|
||||
string: '{"metrics":{"latencyMs":715},"output":{"message":{"content":[{"text":"\n\n120"}],"role":"assistant"}},"stopReason":"end_turn","usage":{"inputTokens":1082,"outputTokens":5,"serverToolUsage":{},"totalTokens":1087}}'
|
||||
headers:
|
||||
Connection:
|
||||
- keep-alive
|
||||
Content-Length:
|
||||
- '212'
|
||||
Content-Type:
|
||||
- application/json
|
||||
Date:
|
||||
- Thu, 22 Jan 2026 21:28:03 GMT
|
||||
x-amzn-RequestId:
|
||||
- X-AMZN-REQUESTID-XXX
|
||||
status:
|
||||
code: 200
|
||||
message: OK
|
||||
version: 1
|
||||
Reference in New Issue
Block a user