Core SDK (raindrop-ai ≥ 0.0.70) | Exact (mirrored) | The OpenLLMetry instrumentations for OpenAI, Anthropic, LangChain, OpenAI Agents, Cohere and Ollama record llm.request.functions.{i}.name / .description / .parameters; the SDK rebuilds ai.prompt.tools from them at export. OpenLLMetry ≥ 0.54 (Anthropic) / 0.55 (OpenAI, LangChain) writes gen_ai.tool.definitions instead, one JSON string; 0.0.72 rebuilds from that too, preferring the legacy keys when both exist, and keeps OpenAI built-ins and Anthropic server tools as provider-defined entries. The wrappers below that sit on those instrumentations bind the list themselves and do not depend on it. The Bedrock, Vertex AI and Google GenAI instrumentations record no tool definitions, so the wrappers below read the request themselves. | tools= on begin() / raindrop.interaction(), interaction.set_tools(), raindrop.prompt_tools() (source= from 0.0.71) |
Amazon Bedrock (raindrop-bedrock ≥ 0.0.11) | Exact | Converse toolConfig.tools[].toolSpec; Anthropic invoke_model bodies’ tools; sync, async and streaming | tools= on RaindropBedrock / create_raindrop_bedrock |
Vertex AI (raindrop-vertex-ai ≥ 0.0.12) | Exact | config.tools of each generate_content call: function_declarations as function tools, google_search / code_execution / … as provider-defined | tools= on RaindropVertexAI / create_raindrop_vertex_ai |
Strands (raindrop-strands ≥ 0.0.13) | Exact | The agent’s registered tool specs, bound around each model call from the before/after-model hooks | tools= on RaindropStrands / create_raindrop_strands |
Google ADK (raindrop-google-adk ≥ 0.0.17) | Exact | LlmRequest.config.tools from a before_model_callback plugin on the wrapped Runner (not run_live()) | tools= on RaindropGoogleADK / setup_google_adk / create_raindrop_google_adk |
Agno (raindrop-agno ≥ 0.0.11, core ≥ 0.0.71) | Catalog (agno.agent.tools) | agent.tools (toolkits expanded) plus team members’ tools; Agno adds its own tools per run | tools= on RaindropAgno / create_raindrop_agno, per target on wrap() |
CrewAI (raindrop-crewai ≥ 0.0.10) | Catalog (crewai.agent.tools) | Union of the crew’s agent and task tools via CrewAI’s own schema conversion; model calls are per agent | tools= on RaindropCrewAI / setup_crewai / create_raindrop_crewai, per crew on wrap() |
LangChain (raindrop-langchain ≥ 0.0.13) | Exact | The callback’s invocation_params["tools"] (or legacy functions), the list bind_tools() put on the request, bound from on_chat_model_start until on_llm_end; the OpenLLMetry langchain instrumentation writes the same list to gen_ai.tool.definitions, which the core rebuilds from since 0.0.72; the wrapper binds the list itself so it works on 0.0.70 too | tools= on RaindropLangchain / RaindropCallbackHandler / create_raindrop_langchain, per call config={"metadata": {"raindrop_tools": [...]}} |
Deep Agents (raindrop-deep-agents ≥ 0.0.10) | Exact | Same callback data as LangChain: your tools plus the Deep Agents built-ins the model was given on that call (write_todos, read_file, task, …) | tools= on RaindropDeepAgents / RaindropDeepAgentsHandler / create_raindrop_deep_agents, per call config={"metadata": {"raindrop_tools": [...]}} |
OpenAI Agents (raindrop-openai-agents ≥ 0.0.12) | Exact through the core (raindrop-ai ≥ 0.0.72), else override only | The Agents SDK trace API shows the processor tool names at agent-span start and the full list only when the response span ends, after the model span started, so the wrapper infers nothing; the OpenLLMetry openai instrumentation (disable_auto_instrument=False) writes the request’s tools to gen_ai.tool.definitions and the core rebuilds ai.prompt.tools from it | tools= on RaindropOpenAIAgents / create_raindrop_openai_agents (through begin(tools=...)), per run RunConfig(trace_metadata={"raindrop_tools": [...]}) |
Azure OpenAI (raindrop-azure-openai ≥ 0.0.12) | Exact | The tools= (or legacy functions=) kwarg of each wrapped chat.completions.create(), sync, async and streaming | tools= on RaindropAzureOpenAI / create_raindrop_azure_openai, per client on wrap(client, tools=[...]) |
Pydantic AI (raindrop-pydantic-ai ≥ 0.0.12) | Exact | ModelRequestParameters.function_tools and output_tools of each Model.request() / request_stream(), plus native_tools (WebSearchTool, …) as provider-defined | tools= on RaindropPydanticAI / create_raindrop_pydantic_ai, per agent on wrap(agent, tools=[...]) |
DSPy (raindrop-dspy ≥ 0.0.11) | Exact | The LM call’s kwargs["tools"] seen by a DSPy on_lm_start callback installed for the wrapped forward(), the native tool list ChatAdapter(use_native_function_calling=True) built | tools= on RaindropDSPy / create_raindrop_dspy, per module on wrap(module, tools=[...]) |