binary-husky/gpt_academic · warning · Exception

Cannot convert response {i} to string

Error message

Cannot convert response {i} to string

What it means

A defensive check in QueryAnalyzer: if a collected response is not a string and str(response) itself raises, it fails with Exception('Cannot convert response {i} to string'). In practice this branch is nearly unreachable because Python's str() almost never raises; when it does, the object came from a broken __str__ implementation in the response type returned by the LLM bridge.

Source

Thrown at crazy_functions/review_fns/query_analyzer.py:187

                llm_kwargs=new_llm_kwargs,
                chatbot=chatbot,
                history_array=[[] for _ in prompts],
                sys_prompt_array=sys_prompts,
                max_workers=5
            )

            # 从收集的响应中提取我们需要的内容
            extracted_responses = []
            for i in range(len(prompts)):
                if (i * 2 + 1) < len(responses):
                    response = responses[i * 2 + 1]
                    if response is None:
                        raise Exception(f"Response {i} is None")
                    if not isinstance(response, str):
                        try:
                            response = str(response)
                        except:
                            raise Exception(f"Cannot convert response {i} to string")
                    extracted_responses.append(response)
                else:
                    raise Exception(f"未收到第 {i + 1} 个响应")

            # 解析基本信息
            query_type = self._extract_tag(extracted_responses[self.BASIC_QUERY_INDEX], "query_type")
            if not query_type:
                print(
                    f"Debug - Failed to extract query_type. Response was: {extracted_responses[self.BASIC_QUERY_INDEX]}")
                raise Exception("无法提取query_type标签内容")
            query_type = query_type.lower()

            main_topic = self._extract_tag(extracted_responses[self.BASIC_QUERY_INDEX], "main_topic")
            if not main_topic:
                print(f"Debug - Failed to extract main_topic. Using query as fallback.")
                main_topic = query

            query_type = self._normalize_query_type(query_type, query)

View on GitHub (pinned to d6bde0fa54)

Solutions

  1. Identify the actual type of responses[i*2+1] by logging it before conversion.
  2. Fix the model adapter/bridge to return plain str for assistant turns.
  3. Catch and inspect: temporarily replace str(response) with repr(response) to see what the object is.
  4. Update or align the custom model integration with the expected string-response contract.
Defensive patterns

Strategy: type-guard

Type guard

from typing import Any

def is_stringifiable(r: Any) -> bool:
    try:
        str(r)
        return True
    except Exception:
        return False

Try / catch

try:
    analyzed = analyzer.analyze(q)
except Exception as e:
    if 'Cannot convert response' in str(e):
        logger.error('model adapter returned a non-string response; check bridge contract')
    raise

Prevention

When it happens

Trigger: The multi-model bridge returns a non-str object (dict, generator, custom object) whose class defines a __str__ that raises; almost any realistic case stops earlier at str() succeeding, so hitting this exact line indicates an exotic response object from a custom model adapter.

Common situations: Custom local-model adapters plugged into the bridge that yield objects instead of strings; None handled separately, so this is only about objects with faulty __str__; extremely rare in stock setups.

Related errors


AI-assisted analysis of binary-husky/gpt_academic@d6bde0fa54 (2026-08-14). Data as JSON: /api/errors/bd16a0db7631402b. Report an issue: GitHub.