test_exact_endpoint_is_used_for_upload_root_and_chat (test_gateway_failure_audit.GatewayFailureAudit.test_exact_endpoint_is_used_for_upload_root_and_chat) ... ok test_multiple_images_preserve_order_mime_bytes_and_same_user (test_gateway_failure_audit.GatewayFailureAudit.test_multiple_images_preserve_order_mime_bytes_and_same_user) ... ok test_old_turn_attachment_is_not_uploaded_for_a_text_followup (test_gateway_failure_audit.GatewayFailureAudit.test_old_turn_attachment_is_not_uploaded_for_a_text_followup) ... ok test_plain_text_does_not_upload (test_gateway_failure_audit.GatewayFailureAudit.test_plain_text_does_not_upload) ... ok test_remote_image_uses_file_reference_without_local_fetch (test_gateway_failure_audit.GatewayFailureAudit.test_remote_image_uses_file_reference_without_local_fetch) ... ok test_same_inline_and_legacy_image_is_only_uploaded_once (test_gateway_failure_audit.GatewayFailureAudit.test_same_inline_and_legacy_image_is_only_uploaded_once) ... ok test_upload_http_failure_is_local_to_dify_outlet (test_gateway_failure_audit.GatewayFailureAudit.test_upload_http_failure_is_local_to_dify_outlet) ... ok test_upload_invalid_json_is_local_to_dify_outlet (test_gateway_failure_audit.GatewayFailureAudit.test_upload_invalid_json_is_local_to_dify_outlet) ... ok test_upload_non_object_json_is_local_to_dify_outlet (test_gateway_failure_audit.GatewayFailureAudit.test_upload_non_object_json_is_local_to_dify_outlet) ... test_upload_non_object_json_is_local_to_dify_outlet (test_gateway_failure_audit.GatewayFailureAudit.test_upload_non_object_json_is_local_to_dify_outlet) (payload=[{'id': 'wrong'}]) ... ERROR test_upload_non_object_json_is_local_to_dify_outlet (test_gateway_failure_audit.GatewayFailureAudit.test_upload_non_object_json_is_local_to_dify_outlet) (payload='wrong-shape') ... ERROR test_upload_non_object_json_is_local_to_dify_outlet (test_gateway_failure_audit.GatewayFailureAudit.test_upload_non_object_json_is_local_to_dify_outlet) (payload=7) ... ERROR test_upload_transport_failure_is_local_to_dify_outlet (test_gateway_failure_audit.GatewayFailureAudit.test_upload_transport_failure_is_local_to_dify_outlet) ... ok ====================================================================== ERROR: test_upload_non_object_json_is_local_to_dify_outlet (test_gateway_failure_audit.GatewayFailureAudit.test_upload_non_object_json_is_local_to_dify_outlet) (payload=[{'id': 'wrong'}]) ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\kefu\deploy\recognition-audit-20260916\test_gateway_failure_audit.py", line 114, in test_upload_non_object_json_is_local_to_dify_outlet self._assert_upload_failure_is_local(httpx.Response(200, json=payload)) File "C:\kefu\deploy\recognition-audit-20260916\test_gateway_failure_audit.py", line 102, in _assert_upload_failure_is_local results = asyncio.run(run()) ^^^^^^^^^^^^^^^^^^ File "C:\Users\isard\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 190, in run return runner.run(main) ^^^^^^^^^^^^^^^^ File "C:\Users\isard\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 118, in run return self._loop.run_until_complete(task) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\isard\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 654, in run_until_complete return future.result() ^^^^^^^^^^^^^^^ File "C:\kefu\deploy\recognition-audit-20260916\test_gateway_failure_audit.py", line 101, in run return await asyncio.gather(gw.call_outlet(client, outlet('dify'), messages(image())), gw.call_outlet(client, outlet('openai'), messages(image()))) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\wechat_rpa\model_gateway.py", line 281, in call_outlet dify_files = await _dify_message_files(client, outlet, messages, image_b64, timeout) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\wechat_rpa\model_gateway.py", line 391, in _dify_message_files files.append(await _dify_upload(client, outlet, data, timeout, mime=mime)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\wechat_rpa\model_gateway.py", line 418, in _dify_upload upload_id = str((response.json() or {}).get("id") or "").strip() ^^^^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: 'list' object has no attribute 'get' ====================================================================== ERROR: test_upload_non_object_json_is_local_to_dify_outlet (test_gateway_failure_audit.GatewayFailureAudit.test_upload_non_object_json_is_local_to_dify_outlet) (payload='wrong-shape') ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\kefu\deploy\recognition-audit-20260916\test_gateway_failure_audit.py", line 114, in test_upload_non_object_json_is_local_to_dify_outlet self._assert_upload_failure_is_local(httpx.Response(200, json=payload)) File "C:\kefu\deploy\recognition-audit-20260916\test_gateway_failure_audit.py", line 102, in _assert_upload_failure_is_local results = asyncio.run(run()) ^^^^^^^^^^^^^^^^^^ File "C:\Users\isard\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 190, in run return runner.run(main) ^^^^^^^^^^^^^^^^ File "C:\Users\isard\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 118, in run return self._loop.run_until_complete(task) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\isard\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 654, in run_until_complete return future.result() ^^^^^^^^^^^^^^^ File "C:\kefu\deploy\recognition-audit-20260916\test_gateway_failure_audit.py", line 101, in run return await asyncio.gather(gw.call_outlet(client, outlet('dify'), messages(image())), gw.call_outlet(client, outlet('openai'), messages(image()))) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\wechat_rpa\model_gateway.py", line 281, in call_outlet dify_files = await _dify_message_files(client, outlet, messages, image_b64, timeout) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\wechat_rpa\model_gateway.py", line 391, in _dify_message_files files.append(await _dify_upload(client, outlet, data, timeout, mime=mime)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\wechat_rpa\model_gateway.py", line 418, in _dify_upload upload_id = str((response.json() or {}).get("id") or "").strip() ^^^^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: 'str' object has no attribute 'get' ====================================================================== ERROR: test_upload_non_object_json_is_local_to_dify_outlet (test_gateway_failure_audit.GatewayFailureAudit.test_upload_non_object_json_is_local_to_dify_outlet) (payload=7) ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\kefu\deploy\recognition-audit-20260916\test_gateway_failure_audit.py", line 114, in test_upload_non_object_json_is_local_to_dify_outlet self._assert_upload_failure_is_local(httpx.Response(200, json=payload)) File "C:\kefu\deploy\recognition-audit-20260916\test_gateway_failure_audit.py", line 102, in _assert_upload_failure_is_local results = asyncio.run(run()) ^^^^^^^^^^^^^^^^^^ File "C:\Users\isard\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 190, in run return runner.run(main) ^^^^^^^^^^^^^^^^ File "C:\Users\isard\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 118, in run return self._loop.run_until_complete(task) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\isard\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 654, in run_until_complete return future.result() ^^^^^^^^^^^^^^^ File "C:\kefu\deploy\recognition-audit-20260916\test_gateway_failure_audit.py", line 101, in run return await asyncio.gather(gw.call_outlet(client, outlet('dify'), messages(image())), gw.call_outlet(client, outlet('openai'), messages(image()))) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\wechat_rpa\model_gateway.py", line 281, in call_outlet dify_files = await _dify_message_files(client, outlet, messages, image_b64, timeout) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\wechat_rpa\model_gateway.py", line 391, in _dify_message_files files.append(await _dify_upload(client, outlet, data, timeout, mime=mime)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\wechat_rpa\model_gateway.py", line 418, in _dify_upload upload_id = str((response.json() or {}).get("id") or "").strip() ^^^^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: 'int' object has no attribute 'get' ---------------------------------------------------------------------- Ran 10 tests in 0.108s FAILED (errors=3)