Skip to content

AssertionError "last.choices[0].finish_reason is not None" when attempting to make stream call with include_usage #88

@Joseevb

Description

@Joseevb

When trying to make a stream request:

{
  "model": "gpt-4o-mini",
  "messages": [
    {
      "role": "user",
      "content": "Test prompt"
    }
  ],
  "stream": true,
  "stream_options": {
    "include_usage": true
  }
}

The docs will return a NetworkError, curl will say transfer closed with outstanding read data remaining, and the logs will have the following:

2025-06-19 10:43:05.651 | DEBUG    | mcp_bridge.openai_clients.streamChatCompletion:chat_completions:94 - inference serverstream done
ERROR:    Exception in ASGI application
  + Exception Group Traceback (most recent call last):
  |   File "/.venv/lib/python3.12/site-packages/uvicorn/protocols/http/h11_impl.py", line 403, in run_asgi
  |     result = await app(  # type: ignore[func-returns-value]
  |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |   File "/.venv/lib/python3.12/site-packages/uvicorn/middleware/proxy_headers.py", line 60, in __call__
  |     return await self.app(scope, receive, send)
  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |   File "/.venv/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__
  |     await super().__call__(scope, receive, send)
  |   File "/.venv/lib/python3.12/site-packages/starlette/applications.py", line 112, in __call__
  |     await self.middleware_stack(scope, receive, send)
  |   File "/.venv/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__
  |     raise exc
  |   File "/.venv/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__
  |     await self.app(scope, receive, _send)
  |   File "/.venv/lib/python3.12/site-packages/opentelemetry/instrumentation/asgi/__init__.py", line 745, in __call__
  |     await self.app(scope, otel_receive, otel_send)
  |   File "/.venv/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__
  |     raise exc
  |   File "/.venv/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__
  |     await self.app(scope, receive, _send)
  |   File "/.venv/lib/python3.12/site-packages/starlette/middleware/cors.py", line 93, in __call__
  |     await self.simple_response(scope, receive, send, request_headers=headers)
  |   File "/.venv/lib/python3.12/site-packages/starlette/middleware/cors.py", line 144, in simple_response
  |     await self.app(scope, receive, send)
  |   File "/.venv/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__
  |     await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
  |   File "/.venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
  |     raise exc
  |   File "/.venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
  |     await app(scope, receive, sender)
  |   File "/.venv/lib/python3.12/site-packages/starlette/routing.py", line 714, in __call__
  |     await self.middleware_stack(scope, receive, send)
  |   File "/.venv/lib/python3.12/site-packages/starlette/routing.py", line 734, in app
  |     await route.handle(scope, receive, send)
  |   File "/.venv/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle
  |     await self.app(scope, receive, send)
  |   File "/.venv/lib/python3.12/site-packages/starlette/routing.py", line 76, in app
  |     await wrap_app_handling_exceptions(app, request)(scope, receive, send)
  |   File "/.venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
  |     raise exc
  |   File "/.venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
  |     await app(scope, receive, sender)
  |   File "/.venv/lib/python3.12/site-packages/starlette/routing.py", line 74, in app
  |     await response(scope, receive, send)
  |   File "/.venv/lib/python3.12/site-packages/sse_starlette/sse.py", line 237, in __call__
  |     async with anyio.create_task_group() as task_group:
  |                ^^^^^^^^^^^^^^^^^^^^^^^^^
  |   File "/.venv/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 772, in __aexit__
  |     raise BaseExceptionGroup(
  | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
  +-+---------------- 1 ----------------
    | Traceback (most recent call last):
    |   File "/.venv/lib/python3.12/site-packages/sse_starlette/sse.py", line 240, in cancel_on_finish
    |     await coro()
    |   File "/.venv/lib/python3.12/site-packages/sse_starlette/sse.py", line 159, in _stream_response
    |     async for data in self.body_iterator:
    |   File "/mcp_bridge/openai_clients/streamChatCompletion.py", line 158, in chat_completions
    |     assert last.choices[0].finish_reason is not None
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    | AssertionError
    +------------------------------------

with multiple

mcp_bridge.openai_clients.streamChatCompletion:chat_completions:101 - failed to lowercase finish_reason: string indices must be integers, not 'str'

When making the request without the stream_options.include_usage field, the error does not happen and it returns the streamed responses correctly.

My configuration is the following:

{
	"inference_server": {
		"base_url": "OPENAI_LLM_URL",
		"api_key": "OPENAI_API_KEY"
	},
	"mcp_servers": {
		"timezone-server": {
			"url": "http://time-tool-server:8001/sse"
		}
	},
	"network": {
		"host": "0.0.0.0",
		"port": 8000
	},
	"logging": {
		"log_level": "DEBUG"
	}
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions