search_provider를 "exa"로 설정하면 Venice가 Zero Data Retention 조건으로 Exa에서 검색을 실행합니다. 인증은 Venice API 키로 하고, 검색 요금은 Venice가 청구하므로 Exa 계정이 필요하지 않습니다.
결과는 모든 제공자에서 동일한 형식으로 반환되므로, Venice의 기본 Brave 검색으로 구축한 어떤 시스템에도 Exa를 그대로 끼워 넣을 수 있으며 제공자 전환은 필드 하나만 바꾸면 됩니다. 이 가이드에서는 엔드포인트 호출, Venice 모델에 Exa 검색을 도구로 제공하는 방법, Exa 결과로 프롬프트를 직접 그라운딩하는 방법, 그리고 대신 Exa 자체 API를 호출해야 하는 경우를 다룹니다.
사전 요구 사항
- Venice API 키
- Python 3.10 이상 또는 Node.js 22 이상
- 에이전트 예제의 경우 함수 호출을 지원하는 Venice 모델. 예제에서는
z-ai-glm-5-3-flash를 사용합니다.
설정
OpenAI SDK를 설치하고, Python의 경우requests도 설치하세요. Node.js에는 fetch가 내장되어 있습니다:
Exa로 검색하기
search_provider를 "exa"로 설정하여 /augment/search로 쿼리를 보내세요:
limit의 기본값은 10이며 1에서 20까지 허용되고, query는 1자에서 400자까지 허용됩니다. 이 범위를 벗어난 값은 범위 내로 조정되지 않고 400을 반환합니다. 많은 페이지가 날짜를 게시하지 않으므로 date는 선택 사항으로 취급하세요.
Venice 모델에 Exa 검색 제공하기
모델이 언제 무엇을 검색할지 결정하게 하려면, 채팅 요청의tools 배열에 web_search 함수를 기술하고 모델이 이를 호출할 때마다 직접 검색을 실행하세요. 이 프로그램은 위의 요청을 검색 헬퍼로 감싸고, 결과를 tool 메시지로 모델에 반환하며, 모델이 텍스트로 답할 때까지 반복합니다:
- 모델이 작성한 쿼리를 잘라내세요. 엔드포인트는 400자를 초과하는 쿼리를 줄이지 않고 거부하며, 모델은 때때로 긴 쿼리를 작성합니다.
- 오류를 도구 결과로 반환하세요. 실패한 검색은
Error:로 시작하는 도구 메시지가 되므로, 루프가 중단되는 대신 모델이 다른 쿼리를 시도하거나 실패를 설명할 수 있습니다. - 도구 결과보다 어시스턴트 메시지를 먼저 추가하세요. 모든
tool메시지는 이를 요청한 어시스턴트 턴 뒤에 와야 합니다. 메시지 객체 자체를 추가하면 GLM 5.3 Flash 같은 추론 모델이 반환하는reasoning_content도 유지되므로, 모델이 라운드 간에 추론을 이어갈 수 있습니다.
content는 최대 약 10,000자의 페이지 텍스트이므로, 모델은 대개 검색 결과만으로 답변할 수 있습니다. 전체 페이지가 필요한 경우 페이지를 Markdown으로 반환하는 /augment/scrape를 호출하는 두 번째 도구를 추가하세요.
먼저 검색한 후 생성하기
함수 호출을 사용하면 모델이 언제 무엇을 검색할지 결정합니다. 코드가 이미 무엇을 검색할지 알고 있다면 도구 루프를 생략할 수 있습니다. Exa 검색을 한 번 실행하고, 결과에 번호를 매긴 뒤, Venice에 그 결과를 바탕으로 답변하도록 요청하세요. 이 방식은 모든 Venice 텍스트 모델에서 동작하며, 프롬프트에 들어간 소스 목록을 직접 보관하므로 답변의 모든 인용이 URL로 연결됩니다. 이전 예제의 검색 헬퍼, 클라이언트, 모델을 사용합니다:"exa"를 전달하면 Exa에서 실행됩니다.
Exa API 직접 사용하기
Venice의 검색 엔드포인트는 쿼리와 결과 수를 받습니다. Exa 자체 API는 더 많은 제어 기능을 제공합니다. 뉴스, 연구 논문, 기업, 인물, 재무 보고서 카테고리, 도메인 및 날짜 필터, 쿼리 중심 하이라이트와 전체 페이지 텍스트, 심층 다단계 검색 등이 있습니다. 이를 사용하려면 Exa 대시보드에서 발급한 API 키로 Exa를 직접 호출하세요. 이러한 요청은 애플리케이션에서 Exa로 직접 전송되며, Venice가 아닌 Exa의 약관이 적용되고 Exa 계정으로 요금이 청구됩니다. Exa는 Enterprise 플랜에서 Zero Data Retention을 제공합니다. Exa SDK인exa-py와 exa-js 2.24.0 이상에는 위의 루프에 바로 넣을 수 있는 Chat Completions 형식의 도구가 포함되어 있습니다. 도구 목록을 Exa의 도구로 교체하세요:
messages += exa.openai.handle_tool_calls(message), Node.js에서는 messages.push(...(await exa.openai.handleToolCalls(message)))를 사용합니다. SDK는 각 Exa 호출을 실행하고 대응하는 tool 메시지를 반환하며, 실패는 Error: 결과로 보고됩니다. exa-js는 제한이 없으면 전체 페이지를 반환하므로 페이지 텍스트 제한은 유지하세요. category, include_domains, start_published_date 같은 키워드 인수는 Exa 검색으로 그대로 전달됩니다. 모든 옵션은 Exa의 도구 호출 가이드를 참조하세요.
권장 모델
모델 ID는 변경될 수 있습니다. 런타임에
GET /models/traits로 현재 함수 호출 기본 모델을 확인하거나, 함수 호출을 지원하는 다른 모델은 텍스트 모델에서 찾아보세요.
개인정보 보호
search_provider: "exa"를 사용하면 애플리케이션은 Venice와만 통신하며, Venice는 Zero Data Retention 조건으로 Exa에서 각 검색을 실행합니다. Venice는 프롬프트나 응답 내용을 저장하지 않으며, 추론 계층에서의 처리는 모델의 개인정보 보호 등급에 따라 결정됩니다. 프라이빗 모델은 데이터를 보존하지 않는 인프라에서 실행됩니다.
놓치기 쉬운 부분은 모델이 대화 내용을 바탕으로 검색 쿼리를 작성하므로, 프롬프트의 세부 정보가 Exa로 전송되는 쿼리에 포함될 수 있다는 점입니다. 프롬프트에 개인 정보나 기밀 정보가 포함될 수 있다면, 시스템 프롬프트에서 해당 정보를 검색에 포함하지 않도록 모델에 지시하거나, 먼저 검색하는 패턴을 사용해 모든 쿼리를 코드가 직접 작성하도록 하세요.
Exa API를 직접 호출하는 경우, 해당 요청은 Exa의 약관에 따라 Exa로 전송됩니다.
비용
검색 1회당 비용은 $0.01(1,000회당 $10)로 Brave 또는 Google 검색과 같습니다. Venice는 채팅 요청에 사용된 토큰과 함께 Venice 계정으로 청구하므로 별도의 Exa 청구서는 없습니다. 오류로 실패한 검색은 청구되지 않지만, 결과가 비어 있는 검색은 청구됩니다. 검색 결과는 다음 라운드에서 모델의 입력으로 다시 전달되며, 페이지 텍스트를 포함하므로 결과 5개짜리 검색은 흔히 5,000~10,000개의 입력 토큰을 추가합니다. 다음 습관으로 두 비용을 모두 줄일 수 있습니다:- 소수의 소스로 충분하다면
limit을 낮추세요. 검색 비용은limit과 관계없이 같지만, 결과가 적을수록 다음 라운드의 입력 토큰이 줄어듭니다. max_rounds를 낮게 유지하세요. 라운드가 늘어날 때마다 토큰뿐 아니라 검색도 추가될 수 있습니다.- 코드가 무엇을 검색할지 알고 있다면 먼저 검색하는 패턴을 사용하세요. 정확히 한 번의 검색과 한 번의 채팅 요청만 실행합니다.
문제 해결
검색 엔드포인트의 400 오류
검색 엔드포인트의 400 오류
query는 1자에서 400자, limit은 1에서 20 사이여야 하며, search_provider는 brave, google, exa 중 하나여야 합니다. 이 범위를 벗어난 값은 범위 내로 조정되지 않고 거부됩니다. 도구 루프에서는 거부된 검색이 예외를 발생시키는 대신 Error: 도구 결과로 모델에 전달됩니다.402 Payment Required
402 Payment Required
Venice 잔액이 요청 비용을 충당하지 못합니다. API 키로 보낸 요청은
INSUFFICIENT_BALANCE를 반환하므로 Venice 잔액을 충전하세요. x402 지갑 인증으로 보낸 요청은 응답에 충전 안내를 반환합니다.도구 라운드 이후 Venice의 400 오류
도구 라운드 이후 Venice의 400 오류
Claude 및 GPT 모델을 포함한 일부 모델은 도구 호출 뒤에 해당
tool_call_id를 가진 tool 메시지가 오지 않으면 400을 반환합니다. GLM 모델은 이런 대화도 그대로 받아들이므로, 이 오류는 모델을 전환할 때 처음 나타날 수 있습니다. 루프는 모든 호출에 대해 이를 요청한 어시스턴트 메시지 바로 뒤에서 응답하므로, 도구를 추가할 때도 이 구조를 유지하세요.모델이 검색하지 않고 답변하는 경우
모델이 검색하지 않고 답변하는 경우
모델이 함수 호출을 지원하는지 확인하고, 시스템 프롬프트에서 언제 검색해야 하는지 명시하세요. 최신 정보나 구체적인 사실을 검색하라고 지시하지 않으면, 모델은 기억만으로 답할 수 있다고 판단할 때 도구를 건너뛰는 경우가 많습니다.
리소스
Web Search API
파라미터, 검색 제공자, 응답 스키마
인용 답변
Venice에서 구축하는 검색, 스크래핑, 인용 전체 파이프라인
함수 호출
Venice에서 도구 호출이 동작하는 방식
Exa 문서
Exa 자체 API, SDK 및 검색 옵션