AI 추론 모드 오류 발생

버전:

Discourse v2026.7.2 — Commits · discourse/discourse · GitHub — Ember v6.10.1

오류 상세 정보:

DiscourseAi::Completions::Endpoints::OpenAi: status: 400 - body: {"error":{"code":400,"upstream_code":"invalid_request_error","message":"The `reasoning_content` in the thinking mode must be passed bac
activesupport-8.0.5/lib/active_support/broadcast_logger.rb:218:in 'block in ActiveSupport::BroadcastLogger#dispatch' 
activesupport-8.0.5/lib/active_support/broadcast_logger.rb:217:in 'Array#map' 
activesupport-8.0.5/lib/active_support/broadcast_logger.rb:217:in 'ActiveSupport::BroadcastLogger#dispatch' 
activesupport-8.0.5/lib/active_support/broadcast_logger.rb:129:in 'ActiveSupport::BroadcastLogger#error' 
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/base.rb:685:in 'Kernel#public_send' 
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/base.rb:685:in 'DiscourseAi::Completions::Endpoints::Base#failed_response_retry_status_and_delay' 
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/base.rb:330:in 'block (3 levels) in DiscourseAi::Completions::Endpoints::Base#perform_completion_request_with_retries' 
net-http-0.9.1/lib/net/http.rb:2461:in 'block in Net::HTTP#transport_request' 
net-http-0.9.1/lib/net/http/response.rb:321:in 'Net::HTTPResponse#reading_body' 
net-http-0.9.1/lib/net/http.rb:2458:in 'Net::HTTP#transport_request' 
net-http-0.9.1/lib/net/http.rb:2410:in 'Net::HTTP#request' 
rack-mini-profiler-4.0.1/lib/patches/net_patches.rb:19:in 'block in Net::HTTP#request_with_mini_profiler' 
rack-mini-profiler-4.0.1/lib/mini_profiler/profiling_methods.rb:51:in 'Rack::MiniProfiler::ProfilingMethods#step' 
rack-mini-profiler-4.0.1/lib/patches/net_patches.rb:18:in 'Net::HTTP#request_with_mini_profiler' 
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/base.rb:325:in 'block (2 levels) in DiscourseAi::Completions::Endpoints::Base#perform_completion_request_with_retries' 
net-http-0.9.1/lib/net/http.rb:1630:in 'Net::HTTP#start' 
net-http-0.9.1/lib/net/http.rb:1064:in 'Net::HTTP.start' 
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/base.rb:306:in 'block in DiscourseAi::Completions::Endpoints::Base#perform_completion_request_with_retries' 
<internal:kernel>:168:in 'Kernel#loop'
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/base.rb:282:in 'DiscourseAi::Completions::Endpoints::Base#perform_completion_request_with_retries' 
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/base.rb:191:in 'DiscourseAi::Completions::Endpoints::Base#perform_completion!' 
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/open_ai_shared.rb:50:in 'DiscourseAi::Completions::Endpoints::OpenAiShared#perform_completion!' 
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/base.rb:218:in 'DiscourseAi::Completions::Endpoints::Base#replay_non_streaming_as_streaming!' 
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/base.rb:172:in 'DiscourseAi::Completions::Endpoints::Base#perform_completion!' 
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/open_ai_shared.rb:50:in 'DiscourseAi::Completions::Endpoints::OpenAiShared#perform_completion!' 
/var/www/discourse/plugins/discourse-ai/lib/completions/llm.rb:245:in 'DiscourseAi::Completions::Llm#generate' 
/var/www/discourse/plugins/discourse-ai/lib/agents/bot.rb:176:in 'DiscourseAi::Agents::Bot#reply' 
/var/www/discourse/plugins/discourse-ai/lib/ai_bot/playground.rb:378:in 'DiscourseAi::AiBot::Playground#reply_to_chat_message' 
/var/www/discourse/plugins/discourse-ai/app/jobs/regular/create_ai_chat_reply.rb:20:in 'Jobs::CreateAiChatReply#execute' 
/var/www/discourse/app/jobs/base.rb:313:in 'block (2 levels) in Jobs::Base#perform' 
rails_multisite-7.0.0/lib/rails_multisite/connection_management/null_instance.rb:49:in 'RailsMultisite::ConnectionManagement::NullInstance#with_connection'
rails_multisite-7.0.0/lib/rails_multisite/connection_management.rb:17:in 'RailsMultisite::ConnectionManagement.with_connection'
/var/www/discourse/app/jobs/base.rb:300:in 'block in Jobs::Base#perform' 
/var/www/discourse/app/jobs/base.rb:297:in 'Array#each' 
/var/www/discourse/app/jobs/base.rb:297:in 'Jobs::Base#perform' 
sidekiq-7.3.10/lib/sidekiq/processor.rb:220:in 'Sidekiq::Processor#execute_job' 
sidekiq-7.3.10/lib/sidekiq/processor.rb:185:in 'block (4 levels) in Sidekiq::Processor#process' 
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:180:in 'Sidekiq::Middleware::Chain#traverse' 
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:183:in 'block in Sidekiq::Middleware::Chain#traverse' 
/var/www/discourse/lib/sidekiq/suppress_user_email_errors.rb:6:in 'Sidekiq::SuppressUserEmailErrors#call' 
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:182:in 'Sidekiq::Middleware::Chain#traverse' 
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:183:in 'block in Sidekiq::Middleware::Chain#traverse' 
/var/www/discourse/lib/sidekiq/discourse_event.rb:6:in 'Sidekiq::DiscourseEvent#call' 
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:182:in 'Sidekiq::Middleware::Chain#traverse' 
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:183:in 'block in Sidekiq::Middleware::Chain#traverse' 
/var/www/discourse/lib/sidekiq/pausable.rb:131:in 'Sidekiq::Pausable#call' 
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:182:in 'Sidekiq::Middleware::Chain#traverse' 
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:183:in 'block in Sidekiq::Middleware::Chain#traverse' 
sidekiq-7.3.10/lib/sidekiq/job/interrupt_handler.rb:9:in 'Sidekiq::Job::InterruptHandler#call' 
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:182:in 'Sidekiq::Middleware::Chain#traverse' 
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:183:in 'block in Sidekiq::Middleware::Chain#traverse' 
sidekiq-7.3.10/lib/sidekiq/metrics/tracking.rb:26:in 'Sidekiq::Metrics::ExecutionTracker#track' 
sidekiq-7.3.10/lib/sidekiq/metrics/tracking.rb:134:in 'Sidekiq::Metrics::Middleware#call' 
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:182:in 'Sidekiq::Middleware::Chain#traverse' 
sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:173:in 'Sidekiq::Middleware::Chain#invoke' 
sidekiq-7.3.10/lib/sidekiq/processor.rb:184:in 'block (3 levels) in Sidekiq::Processor#process' 
sidekiq-7.3.10/lib/sidekiq/processor.rb:145:in 'block (6 levels) in Sidekiq::Processor#dispatch' 
sidekiq-7.3.10/lib/sidekiq/job_retry.rb:118:in 'Sidekiq::JobRetry#local' 
sidekiq-7.3.10/lib/sidekiq/processor.rb:144:in 'block (5 levels) in Sidekiq::Processor#dispatch' 
sidekiq-7.3.10/lib/sidekiq/config.rb:39:in 'block in <class:Config>' 
sidekiq-7.3.10/lib/sidekiq/processor.rb:139:in 'block (4 levels) in Sidekiq::Processor#dispatch' 
sidekiq-7.3.10/lib/sidekiq/processor.rb:281:in 'Sidekiq::Processor#stats' 
sidekiq-7.3.10/lib/sidekiq/processor.rb:134:in 'block (3 levels) in Sidekiq::Processor#dispatch' 
sidekiq-7.3.10/lib/sidekiq/job_logger.rb:15:in 'Sidekiq::JobLogger#call' 
sidekiq-7.3.10/lib/sidekiq/processor.rb:133:in 'block (2 levels) in Sidekiq::Processor#dispatch' 
sidekiq-7.3.10/lib/sidekiq/job_retry.rb:85:in 'Sidekiq::JobRetry#global' 
sidekiq-7.3.10/lib/sidekiq/processor.rb:132:in 'block in Sidekiq::Processor#dispatch' 
sidekiq-7.3.10/lib/sidekiq/job_logger.rb:40:in 'Sidekiq::JobLogger#prepare' 
sidekiq-7.3.10/lib/sidekiq/processor.rb:131:in 'Sidekiq::Processor#dispatch' 
sidekiq-7.3.10/lib/sidekiq/processor.rb:183:in 'block (2 levels) in Sidekiq::Processor#process' 
sidekiq-7.3.10/lib/sidekiq/processor.rb:182:in 'Thread.handle_interrupt' 
sidekiq-7.3.10/lib/sidekiq/processor.rb:182:in 'block in Sidekiq::Processor#process' 
sidekiq-7.3.10/lib/sidekiq/processor.rb:181:in 'Thread.handle_interrupt' 
sidekiq-7.3.10/lib/sidekiq/processor.rb:181:in 'Sidekiq::Processor#process' 
sidekiq-7.3.10/lib/sidekiq/processor.rb:86:in 'Sidekiq::Processor#process_one' 
sidekiq-7.3.10/lib/sidekiq/processor.rb:76:in 'Sidekiq::Processor#run' 
sidekiq-7.3.10/lib/sidekiq/component.rb:10:in 'Sidekiq::Component#watchdog' 
sidekiq-7.3.10/lib/sidekiq/component.rb:19:in 'block in Sidekiq::Component#safe_thread' 

AI 설정:

다음과 같은 시도를 해보았습니다:

시도 1:
스트리밍 완성 기능을 비활성화(스트리밍 요청을 비스트리밍 요청으로 변환)했지만, 테스트를 실행하면 다음 오류가 발생했습니다:

스트리밍 요청 실패: 모델이 빈 응답을 반환했습니다.

시도 2:
스트리밍 완성 비활성화 해제(스트리밍 요청을 비스트리밍 요청으로 변환)

동시에 추론 작업(추론 모델에만 적용) (선택 사항)을 none으로 선택했습니다.

테스트는 정상적으로 실행되었지만, 이렇게 하면 추론 기능이 사라지는데 이는 제가 원하는 것이 아닙니다.

의문: AI 플러그인이 테스트 실행 로직을 제대로 처리하지 못한 것일까요, 아니면 제가 연동한 LLM 플랫폼의 반환 형식이 일치하지 않는 것일까요? 구체적인 문제를 파악하기 위해 추가 정보가 필요하시면 기꺼이 제공하겠습니다.

DiscourseAi::Completions::Endpoints::OpenAi: ... 오류 메시지가 잘린 건가요?

방금 해당 오류 메시지를 Bing에서 검색해 봤는데, DeepSeek 프로바이더에 특정한 문제인 것 같습니다.

https://blog.csdn.net/weixin_38106322/article/details/161165043

다른 프로바이더(예: OpenRouter)를 테스트해 보셨나요?

답변해 주셔서 감사합니다. 저는 기업 내부에서 자체적으로 구축한 LLM 라우터 서비스를 사용하고 있습니다.

OpenRouter는 시도해 본 적이 없으며, 해당 서비스를 가입하지 않았습니다.

문제가 DeepSeek가 완료 과정에서 추론 토큰을 다시 보내야 하는 것(또는 상호작용형 사고로도 알려져 있음[1])이라면, 저는 이것이 정당한 기능 요청이라고 생각합니다.


  1. 이것이 정확하지 않을 수 있습니다. 검색해 본 결과 상호작용형 사고는 임의의 콘텐츠가 아니라 도구 호출 사이에 추론을 보존하는 것과 더 관련이 있습니다 ↩︎