리서치 에이전트 커스텀 노드 함수

Input Variables

  • $args = {{$flow.state.arguments}} : LLM 노드에서 생성하는 Output 중 <tool_call></tool_call> 안의 툴 사용 arguments 를 state 에 저장해두고 사용합니다. (아래 모든 Tool 이 동일하게 사용합니다)

const fetch = require('node-fetch');
const querystring = require('querystring');

const args = JSON.parse($args);

const search_query = args.search_query;
const num_results = args.num_results;

const apiKey = 'YOUR_API_KEY_HERE';

const searchQuery = async (queryObj) => {
  const { q, recency, domains } = queryObj;
  const url = `https://www.searchapi.io/api/v1/search`;

  let days = 0;
  if (recency) {
    days = parseInt(recency, 10);
  }

  let query = null;
  let domainStr = '';
  if (domains) {
    domainStr = domains.map(domain => `site:${domain.trim()}`).join(' OR ');
    query = `${q} ${domainStr}`;
  } else {
    query = q;
  }

  const params = {
    engine: 'google',
    api_key: apiKey,
    q: query
  };

  if (num_results) {
    params.num = num_results
  } else {
    params.num = 5
  }

  if (days > 0) {
    params.tbs = `qdr:d${days}`;
  }

  try {
    const response = await fetch(`${url}?${querystring.stringify(params)}`);

    if (!response.ok) {
      throw new Error(`API 요청 실패: ${response.statusText}`);
    }

    const data = await response.json();
    const results = data.organic_results || [];

    const search_summary = results.map(item => ({
      title: item.title || null,
      url: item.link || null,
      snippet: item.snippet || null,
      source: item.source || null,
      date: item.date || null
    }));

    return search_summary;
  } catch (error) {
    return `Error: ${error.message}`;
  }
};

return (async () => {
  const results = await Promise.all(search_query.map(searchQuery));
  const flatResults = results.flat();
  const updatedList = flatResults.map((d, idx) => ({
    id: idx,
    ...d
}));
  const resultString = updatedList.map(item => 
    item.date
      ? `- ${item.title} (${item.url}): ${item.date}${item.snippet} 【search${item.id}】`
      : `- ${item.title} (${item.url}): ${item.snippet} 【search${item.id}】`
  ).join('\n');

  return resultString;
})();

2. Tool - Open URL

  • Open URL Tool 의 경우는 추가 패키지가 필요하기 때문에 MCP Tool 로 구현하여 사용했습니다.

  • GenOS 메뉴 중 배포 > 도구 > MCP 서버 & MCP 도구 메뉴에서 생성하고, Tool 노드에서 해당 MCP 도구를 선택하여 사용합니다.

  • 아래는 LLM 이 생성한 argument 를 파싱하는 코드입니다.

try {
    // 안전한 JSON 파싱
    let args;
    if (typeof $args === 'string') {
        args = JSON.parse($args);
    } else {
        args = $args;
    }
    
    console.log('파싱된 args:', args);
    
    const opens_list = args.opens || [];
    
    console.log('추출된 opens_list:', opens_list);
    
    return opens_list;
    
} catch (error) {
    console.error('JSON 파싱 오류:', error.message);
    console.error('입력값:', $args);
    
    // 오류 발생시 빈 배열 반환
    return [];
}

3. Tool - External APIs

  • 다른 API 도 아래와 동일하게 사용하시면 됩니다.

  • 예시는 DeepSearch API (기업, 금융 데이터)

const fetch = require('node-fetch');

const args = JSON.parse($args);

const symbols = args.symbols;
const base_url = "https://api-v2.deepsearch.com/v2/companies";
const headers = {
  "Authorization": "Bearer YOUR_API_KEY_HERE",
  "Content-Type": "application/json"
};

const fetchSymbol = async (symbol) => {
  try {
    const response = await fetch(
      `${base_url}/${symbol}`,
      {headers: headers}
    );

    if (!response.ok) {
      throw new Error(`API 요청 실패: ${response.statusText}`);
    }

    const result = await response.json();
    const data = result.data || {};
    
    return data;
  } catch (error) {
    return `Error: ${error.message}`
  }
}

return (async() => {
  const results = await Promise.all(symbols.map(fetchSymbol));
  return results;
})();

Last updated

Was this helpful?