Napolean_Solo
02/17/2026, 11:17 AMUday
02/17/2026, 2:22 PMNapolean_Solo
02/17/2026, 9:39 PMUday
02/18/2026, 6:19 AMrate and it's completely optional(will defaults to null if not passed). You can use this api ref to check the schema: https://docs.composio.dev/reference/api-reference/tools/getToolsByToolSlug. The agent might be passing the value explicitly, could you check if this is consistent behaviour and lmk?Napolean_Solo
02/18/2026, 10:22 AMNapolean_Solo
02/18/2026, 10:25 AMNapolean_Solo
02/18/2026, 10:39 AMUday
02/18/2026, 4:02 PMNapolean_Solo
02/18/2026, 5:51 PMNapolean_Solo
02/19/2026, 10:19 AMUday
02/20/2026, 6:19 AMimport asyncio
import os
from typing import Any, cast
from agents import Agent, Runner
from composio import Composio
from composio_openai_agents import OpenAIAgentsProvider
user_id = "<user-id>"
composio = Composio(
provider=OpenAIAgentsProvider(),
api_key="<composio-api-key>",
toolkit_versions={"zoho_books": "20260211_00"},
)
tools = composio.tools.get(
user_id=user_id,
tools=["ZOHO_BOOKS_LIST_ITEMS"],
)
agent = Agent(
name="Deep Researcher",
instructions=(
"You are an investigative journalist. Use the ZOHO_BOOKS_LIST_ITEMS tool when asked to get or list Zoho Books items; do not refuse or say you lack access—call the tool with the given organization_id."
),
tools=cast(Any, tools),
model="gpt-5.2",
)
async def main():
result = await Runner.run(
starting_agent=agent,
input=("get ZOHO_BOOKS_LIST_ITEMS for organization_id <id>"),
)
print(result)
asyncio.run(main())
Or Alternatively, you can use tool-router: https://docs.composio.dev/docs/quickstart