Agent Studio 의 Tool 에서 impyla 로 CDW Hive · Impala 에 붙을 때 No module named 'kerberos' 가 난다. impyla 만으로는 GSSAPI 인증이 되지 않고 별도 모듈이 필요하다.
# Tool 의 requirements.txt
impyla
pydantic>=2.10.6
requests-kerberos
kerberos
gssapi
kerberos 와 gssapi 는 시스템 라이브러리(krb5-devel)가 있어야 pip 설치가 된다. 런타임에 헤더가 없으면 설치가 실패하므로 먼저 확인한다.
find / -name "krb5.h" 2>/dev/null
pip install kerberos requests-kerberos
python3 -c "import kerberos; import requests_kerberos; print('ok')"
설치가 안 되면 순수 파이썬 구현인 pure-sasl 조합이나, JDBC URL 을 아는 경우 JDBC 경유로 우회한다. 환경변수로 KRB5_CONFIG=/etc/krb5.conf 를 지정해야 하는 경우도 있다.
Copilot 기능에서 Knox Inference 엔드포인트가 401 을 돌려주는 것은 별개 문제다. CML 세션 JWT 는 Knox 의 cdpauth 가 요구하는 CDP Access Token 과 다르다. 환경의 IDBroker 매핑에서 CML 세션 사용자에게 Inference 접근 권한을 주고, Knox 쪽 cdpauth 정책에서 CML → Inference 신뢰 관계를 확인해야 한다.
Agent Studio 의 이메일 에이전트가 테스트 때마다 같은 메일을 세 번 보냈다. Phoenix 트레이스에서 Tool 호출을 보니 수신자 한 명만 지정했는데 입력이 이렇게 들어가 있었다.
{
"recipients": ["a@example.com"],
"cc": ["a@example.com"],
"bcc": ["a@example.com"]
}
cc 와 bcc 가 Optional 인데 "언제 비워야 하는지" 설명이 없어 LLM 이 임의로 채운 것이다. 필드 설명에 기본값 규칙을 명시하면 해결된다.
class ToolParameters(BaseModel):
recipients: List[str] = Field(description="수신자 목록")
cc: Optional[List[str]] = Field(
default=None,
description="CC 목록. 명시적으로 요청된 경우에만 입력. 없으면 반드시 null. 예) ['cc@example.com']")
bcc: Optional[List[str]] = Field(
default=None,
description="BCC 목록. 명시적으로 요청된 경우에만 입력. 없으면 반드시 null.")
attachments: Optional[List[str]] = Field(
default=None,
description="첨부 파일 경로 목록. 명시적으로 요청된 경우에만 입력. 없으면 반드시 null.")
Arguments validation failed 가 함께 났다면 파라미터를 {key: value} 로 받는 run_tool(args) 구조에서 args.action 분기와 Pydantic 모델 필드가 어긋난 경우이니 두 정의를 맞춘다.
Agent Studio 는 Phoenix 로 트레이스를 남긴다. Tool 호출 횟수, 각 호출의 입력 JSON, LLM 의 thinking 단계를 여기서 본다. 같은 Tool 이 여러 번 보이면 에이전트가 재시도하는 것이므로, Tool 응답이 성공을 명확히 돌려주는지({"status": "success", ...}) 확인한다. 응답이 애매하면 에이전트가 실패로 보고 다시 호출한다.