Compare commits

...

2 Commits

Author SHA1 Message Date
Devin AI
9af03058fe fix: skip signal handler registration in non-main thread
When CrewAI is initialized from a non-main thread (e.g., in Streamlit,
Flask, Django, Jupyter), the telemetry module was printing multiple
ValueError tracebacks for each signal handler registration attempt.

This fix adds a proactive main thread check in _register_shutdown_handlers()
before attempting signal registration. If not in the main thread, a debug
message is logged and signal handler registration is skipped.

Fixes #4289

Co-Authored-By: João <joao@crewai.com>
2026-01-27 19:45:52 +00:00
Greyson LaLonde
d52dbc1f4b chore: add missing change logs (#4285)
Some checks failed
CodeQL Advanced / Analyze (actions) (push) Has been cancelled
CodeQL Advanced / Analyze (python) (push) Has been cancelled
Notify Downstream / notify-downstream (push) Has been cancelled
Check Documentation Broken Links / Check broken links (push) Has been cancelled
Mark stale issues and pull requests / stale (push) Has been cancelled
* chore: add missing change logs

* chore: add translations
2026-01-26 18:26:01 -08:00
5 changed files with 299 additions and 1 deletions

View File

@@ -4,6 +4,74 @@ description: "Product updates, improvements, and bug fixes for CrewAI"
icon: "clock"
mode: "wide"
---
<Update label="Jan 26, 2026">
## v1.9.0
[View release on GitHub](https://github.com/crewAIInc/crewAI/releases/tag/1.9.0)
## What's Changed
### Features
- Add structured outputs and response_format support across providers
- Add response ID to streaming responses
- Add event ordering with parent-child hierarchies
- Add Keycloak SSO authentication support
- Add multimodal file handling capabilities
- Add native OpenAI responses API support
- Add A2A task execution utilities
- Add A2A server configuration and agent card generation
- Enhance event system and expand transport options
- Improve tool calling mechanisms
### Bug Fixes
- Enhance file store with fallback memory cache when aiocache is not available
- Ensure document list is not empty
- Handle Bedrock stop sequences properly
- Add Google Vertex API key support
- Enhance Azure model stop word detection
- Improve error handling for HumanFeedbackPending in flow execution
- Fix execution span task unlinking
### Documentation
- Add native file handling documentation
- Add OpenAI responses API documentation
- Add agent card implementation guidance
- Refine A2A documentation
- Update changelog for v1.8.0
### Contributors
@Anaisdg, @GininDenis, @Vidit-Ostwal, @greysonlalonde, @heitorado, @joaomdmoura, @koushiv777, @lorenzejay, @nicoferdi96, @vinibrsl
</Update>
<Update label="Jan 15, 2026">
## v1.8.1
[View release on GitHub](https://github.com/crewAIInc/crewAI/releases/tag/1.8.1)
## What's Changed
### Features
- Add A2A task execution utilities
- Add A2A server configuration and agent card generation
- Add additional transport mechanisms
- Add Galileo integration support
### Bug Fixes
- Improve Azure model compatibility
- Expand frame inspection depth to detect parent_flow
- Resolve task execution span management issues
- Enhance error handling for human feedback scenarios during flow execution
### Documentation
- Add A2A agent card documentation
- Add PII redaction feature documentation
### Contributors
@Anaisdg, @GininDenis, @greysonlalonde, @joaomdmoura, @koushiv777, @lorenzejay, @vinibrsl
</Update>
<Update label="Jan 08, 2026">
## v1.8.0

View File

@@ -4,6 +4,74 @@ description: "CrewAI의 제품 업데이트, 개선 사항 및 버그 수정"
icon: "clock"
mode: "wide"
---
<Update label="2026년 1월 26일">
## v1.9.0
[GitHub 릴리스 보기](https://github.com/crewAIInc/crewAI/releases/tag/1.9.0)
## 변경 사항
### 기능
- 프로바이더 전반에 걸친 구조화된 출력 및 response_format 지원 추가
- 스트리밍 응답에 응답 ID 추가
- 부모-자식 계층 구조를 가진 이벤트 순서 추가
- Keycloak SSO 인증 지원 추가
- 멀티모달 파일 처리 기능 추가
- 네이티브 OpenAI responses API 지원 추가
- A2A 작업 실행 유틸리티 추가
- A2A 서버 구성 및 에이전트 카드 생성 추가
- 이벤트 시스템 향상 및 전송 옵션 확장
- 도구 호출 메커니즘 개선
### 버그 수정
- aiocache를 사용할 수 없을 때 폴백 메모리 캐시로 파일 저장소 향상
- 문서 목록이 비어 있지 않도록 보장
- Bedrock 중지 시퀀스 적절히 처리
- Google Vertex API 키 지원 추가
- Azure 모델 중지 단어 감지 향상
- 흐름 실행 시 HumanFeedbackPending 오류 처리 개선
- 실행 스팬 작업 연결 해제 수정
### 문서
- 네이티브 파일 처리 문서 추가
- OpenAI responses API 문서 추가
- 에이전트 카드 구현 가이드 추가
- A2A 문서 개선
- v1.8.0 변경 로그 업데이트
### 기여자
@Anaisdg, @GininDenis, @Vidit-Ostwal, @greysonlalonde, @heitorado, @joaomdmoura, @koushiv777, @lorenzejay, @nicoferdi96, @vinibrsl
</Update>
<Update label="2026년 1월 15일">
## v1.8.1
[GitHub 릴리스 보기](https://github.com/crewAIInc/crewAI/releases/tag/1.8.1)
## 변경 사항
### 기능
- A2A 작업 실행 유틸리티 추가
- A2A 서버 구성 및 에이전트 카드 생성 추가
- 추가 전송 메커니즘 추가
- Galileo 통합 지원 추가
### 버그 수정
- Azure 모델 호환성 개선
- parent_flow 감지를 위한 프레임 검사 깊이 확장
- 작업 실행 스팬 관리 문제 해결
- 흐름 실행 중 휴먼 피드백 시나리오에 대한 오류 처리 향상
### 문서
- A2A 에이전트 카드 문서 추가
- PII 삭제 기능 문서 추가
### 기여자
@Anaisdg, @GininDenis, @greysonlalonde, @joaomdmoura, @koushiv777, @lorenzejay, @vinibrsl
</Update>
<Update label="2026년 1월 8일">
## v1.8.0

View File

@@ -4,6 +4,74 @@ description: "Atualizações de produto, melhorias e correções do CrewAI"
icon: "clock"
mode: "wide"
---
<Update label="26 jan 2026">
## v1.9.0
[Ver release no GitHub](https://github.com/crewAIInc/crewAI/releases/tag/1.9.0)
## O que Mudou
### Funcionalidades
- Adicionar suporte a saídas estruturadas e response_format em vários provedores
- Adicionar ID de resposta às respostas de streaming
- Adicionar ordenação de eventos com hierarquias pai-filho
- Adicionar suporte à autenticação SSO Keycloak
- Adicionar capacidades de manipulação de arquivos multimodais
- Adicionar suporte nativo à API de respostas OpenAI
- Adicionar utilitários de execução de tarefas A2A
- Adicionar configuração de servidor A2A e geração de cartão de agente
- Aprimorar sistema de eventos e expandir opções de transporte
- Melhorar mecanismos de chamada de ferramentas
### Correções de Bugs
- Aprimorar armazenamento de arquivos com cache de memória de fallback quando aiocache não está disponível
- Garantir que lista de documentos não esteja vazia
- Tratar sequências de parada do Bedrock adequadamente
- Adicionar suporte à chave de API do Google Vertex
- Aprimorar detecção de palavras de parada do modelo Azure
- Melhorar tratamento de erros para HumanFeedbackPending na execução de fluxo
- Corrigir desvinculação de tarefa do span de execução
### Documentação
- Adicionar documentação de manipulação nativa de arquivos
- Adicionar documentação da API de respostas OpenAI
- Adicionar orientação de implementação de cartão de agente
- Refinar documentação A2A
- Atualizar changelog para v1.8.0
### Contribuidores
@Anaisdg, @GininDenis, @Vidit-Ostwal, @greysonlalonde, @heitorado, @joaomdmoura, @koushiv777, @lorenzejay, @nicoferdi96, @vinibrsl
</Update>
<Update label="15 jan 2026">
## v1.8.1
[Ver release no GitHub](https://github.com/crewAIInc/crewAI/releases/tag/1.8.1)
## O que Mudou
### Funcionalidades
- Adicionar utilitários de execução de tarefas A2A
- Adicionar configuração de servidor A2A e geração de cartão de agente
- Adicionar mecanismos de transporte adicionais
- Adicionar suporte à integração Galileo
### Correções de Bugs
- Melhorar compatibilidade do modelo Azure
- Expandir profundidade de inspeção de frame para detectar parent_flow
- Resolver problemas de gerenciamento de span de execução de tarefas
- Aprimorar tratamento de erros para cenários de feedback humano durante execução de fluxo
### Documentação
- Adicionar documentação de cartão de agente A2A
- Adicionar documentação de recurso de redação de PII
### Contribuidores
@Anaisdg, @GininDenis, @greysonlalonde, @joaomdmoura, @koushiv777, @lorenzejay, @vinibrsl
</Update>
<Update label="08 jan 2026">
## v1.8.0

View File

@@ -173,6 +173,13 @@ class Telemetry:
self._original_handlers: dict[int, Any] = {}
if threading.current_thread() is not threading.main_thread():
logger.debug(
"CrewAI telemetry: Skipping signal handler registration "
"(not running in main thread)."
)
return
self._register_signal_handler(signal.SIGTERM, SigTermEvent, shutdown=True)
self._register_signal_handler(signal.SIGINT, SigIntEvent, shutdown=True)
if hasattr(signal, "SIGHUP"):

View File

@@ -1,6 +1,6 @@
import os
import threading
from unittest.mock import patch
from unittest.mock import MagicMock, patch
import pytest
from crewai import Agent, Crew, Task
@@ -121,3 +121,90 @@ def test_telemetry_singleton_pattern():
thread.join()
assert all(instance is telemetry1 for instance in instances)
def test_signal_handler_registration_skipped_in_non_main_thread():
"""Test that signal handler registration is skipped when running from a non-main thread.
This test verifies that when Telemetry is initialized from a non-main thread,
the signal handler registration is skipped without raising noisy ValueError tracebacks.
See: https://github.com/crewAIInc/crewAI/issues/4289
"""
Telemetry._instance = None
result = {"register_signal_handler_called": False, "error": None}
def init_telemetry_in_thread():
try:
with patch("crewai.telemetry.telemetry.TracerProvider"):
with patch.object(
Telemetry,
"_register_signal_handler",
wraps=lambda *args, **kwargs: None,
) as mock_register:
telemetry = Telemetry()
result["register_signal_handler_called"] = mock_register.called
result["telemetry"] = telemetry
except Exception as e:
result["error"] = e
thread = threading.Thread(target=init_telemetry_in_thread)
thread.start()
thread.join()
assert result["error"] is None, f"Unexpected error: {result['error']}"
assert (
result["register_signal_handler_called"] is False
), "Signal handler should not be registered in non-main thread"
def test_signal_handler_registration_skipped_logs_debug_message():
"""Test that a debug message is logged when signal handler registration is skipped.
This test verifies that when Telemetry is initialized from a non-main thread,
a debug message is logged indicating that signal handler registration was skipped.
"""
Telemetry._instance = None
result = {"telemetry": None, "error": None, "debug_calls": []}
mock_logger_debug = MagicMock()
def init_telemetry_in_thread():
try:
with patch("crewai.telemetry.telemetry.TracerProvider"):
with patch(
"crewai.telemetry.telemetry.logger.debug", mock_logger_debug
):
result["telemetry"] = Telemetry()
result["debug_calls"] = [
str(call) for call in mock_logger_debug.call_args_list
]
except Exception as e:
result["error"] = e
thread = threading.Thread(target=init_telemetry_in_thread)
thread.start()
thread.join()
assert result["error"] is None, f"Unexpected error: {result['error']}"
assert result["telemetry"] is not None
debug_calls = result["debug_calls"]
assert any(
"Skipping signal handler registration" in call for call in debug_calls
), f"Expected debug message about skipping signal handler registration, got: {debug_calls}"
def test_signal_handlers_registered_in_main_thread():
"""Test that signal handlers are registered when running from the main thread."""
Telemetry._instance = None
with patch("crewai.telemetry.telemetry.TracerProvider"):
with patch(
"crewai.telemetry.telemetry.Telemetry._register_signal_handler"
) as mock_register:
telemetry = Telemetry()
assert telemetry.ready is True
assert mock_register.call_count >= 2