Tool calls

Tool calls are useful when you want the client to display tool execution as part of the assistant run.

Streaming a tool call

Use assistant_stream_ce.create_run.RunController.add_tool_call() to start a tool call and get a assistant_stream_ce.modules.tool_call.ToolCallController:

import json

async def run(controller):
    tool = await controller.add_tool_call("weather")
    tool.append_args_text(json.dumps({"location": "Athens"}))
    tool.set_response({"temp_c": 18})

The library emits:

  1. tool-call-begin chunk

  2. One or more tool-call-delta chunks (argument text deltas)

  3. A final tool-result chunk

Tool call IDs

If you don’t provide a tool_call_id, assistant-stream generates one in the call_... style:

assistant_stream_ce.modules.tool_call.generate_openai_style_tool_call_id()[source]

Returning artifacts

When sending a tool result, you may also include an artifact payload and/or set is_error=True:

tool.set_response(
    {"ok": False, "message": "failed"},
    artifact={"debug": "..."},
    is_error=True,
)

Nested streams

Tool calls are implemented as substreams that are merged into the parent stream. You can create more complex behavior by combining multiple streams with assistant_stream.create_run.RunController.add_stream().