Skip to content

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

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"
	}
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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