> ## Documentation Index
> Fetch the complete documentation index at: https://apidoc.cometapi.com/llms.txt
> Use this file to discover all available pages before exploring further.

# CometAPI와 함께 CrewAI 사용하기

> 하나의 순차적 멀티 에이전트 Crew에서 CometAPI와 함께 네 가지 CrewAI LLM 전송 구성을 사용합니다.

[CrewAI](https://docs.crewai.com/) 는 AI 에이전트와 작업을 조율하는 Python 프레임워크입니다. 이 가이드에서는 하나의 순차적 Crew가 OpenAI 채팅 완성, OpenAI 응답, Anthropic 메시지, Gemini `generateContent`의 네 가지 CrewAI 전송 구성을 통해 CometAPI를 호출하도록 구성합니다.

## 사전 요구 사항

* Python 3.10–3.13
* [`uv`](https://docs.astral.sh/uv/getting-started/installation/)
* 활성 API 키가 있는 CometAPI 계정 — [대시보드에서 발급받기](https://www.cometapi.com/console/token)
* 아래에 표시된 전송에 사용할 텍스트 모델 ID 4개

## 통합 구성

<Steps>
  <Step title="프로젝트 생성 및 CrewAI 설치">
    새 `uv` 프로젝트를 만들고 Anthropic 및 Google Gen AI 추가 구성 요소와 함께 CrewAI를 설치합니다:

    ```bash theme={null}
    uv init crewai-cometapi
    cd crewai-cometapi
    uv add 'crewai[anthropic,google-genai]'
    ```
  </Step>

  <Step title="API 키 및 모델 ID 설정">
    CometAPI API 키와 각 전송에 사용할 모델 ID 하나를 설정합니다:

    ```bash theme={null}
    read -rsp "CometAPI API key: " COMETAPI_KEY
    printf '\n'
    export COMETAPI_KEY

    export COMETAPI_CHAT_MODEL_ID=your-model-id
    export COMETAPI_RESPONSES_MODEL_ID=your-model-id
    export COMETAPI_ANTHROPIC_MODEL_ID=your-model-id
    export COMETAPI_GEMINI_MODEL_ID=your-model-id
    ```

    모든 `your-model-id` 값을 다음의 모델 ID로 바꾸세요 [CometAPI 모델 페이지](/ko/overview/models). 네 값은 서로 달라도 됩니다. 각 모델 ID를 해당 전송에 할당하세요.
  </Step>

  <Step title="순차적 Crew 생성">
    다음 예제를 `crew.py`로 저장하세요:

    ```python theme={null}
    import os

    from crewai import Agent, Crew, LLM, Process, Task


    api_key = os.environ["COMETAPI_KEY"]

    chat_llm = LLM(
        model=os.environ["COMETAPI_CHAT_MODEL_ID"],
        custom_openai=True,
        api="completions",
        base_url="https://api.cometapi.com/v1",
        api_key=api_key,
        max_tokens=512,
        max_retries=0,
    )

    responses_llm = LLM(
        model=os.environ["COMETAPI_RESPONSES_MODEL_ID"],
        custom_openai=True,
        api="responses",
        base_url="https://api.cometapi.com/v1",
        api_key=api_key,
        max_completion_tokens=512,
        max_retries=0,
    )

    anthropic_llm = LLM(
        model=f"anthropic/{os.environ['COMETAPI_ANTHROPIC_MODEL_ID']}",
        base_url="https://api.cometapi.com",
        api_key=api_key,
        max_tokens=512,
        max_retries=0,
    )

    gemini_llm = LLM(
        model=f"gemini/{os.environ['COMETAPI_GEMINI_MODEL_ID']}",
        api_key=api_key,
        max_output_tokens=512,
        thinking_config={"thinking_budget": 0, "include_thoughts": False},
        client_params={
            "http_options": {
                "base_url": "https://api.cometapi.com",
                "api_version": "v1beta",
            }
        },
    )

    audience_agent = Agent(
        role="Audience researcher",
        goal="Define the audience for an API migration brief",
        backstory="You turn product goals into a precise audience statement.",
        llm=chat_llm,
        tools=[],
        allow_delegation=False,
        max_iter=1,
        max_retry_limit=0,
        verbose=False,
    )

    requirements_agent = Agent(
        role="Requirements planner",
        goal="Turn an audience statement into implementation requirements",
        backstory="You write concise, testable requirements for API teams.",
        llm=responses_llm,
        tools=[],
        allow_delegation=False,
        max_iter=1,
        max_retry_limit=0,
        verbose=False,
    )

    risk_agent = Agent(
        role="Risk reviewer",
        goal="Identify the most important migration risk",
        backstory="You review plans for practical delivery risks.",
        llm=anthropic_llm,
        tools=[],
        allow_delegation=False,
        max_iter=1,
        max_retry_limit=0,
        verbose=False,
    )

    editor_agent = Agent(
        role="Release brief editor",
        goal="Combine research, requirements, and risk into one brief",
        backstory="You preserve source findings while producing clear summaries.",
        llm=gemini_llm,
        tools=[],
        allow_delegation=False,
        max_iter=1,
        max_retry_limit=0,
        verbose=False,
    )

    audience_task = Task(
        description=(
            "Define one target audience for a team moving an existing OpenAI "
            "integration to a multi-provider API. Return only an Audience heading "
            "and one sentence of at most 20 words."
        ),
        expected_output="An Audience heading followed by one concise sentence.",
        agent=audience_agent,
    )

    requirements_task = Task(
        description=(
            "Using the audience statement in your context, return only a "
            "Requirements heading and exactly two numbered requirements. Keep each "
            "requirement to at most 18 words."
        ),
        expected_output="A Requirements heading followed by two numbered items.",
        agent=requirements_agent,
        context=[audience_task],
    )

    risk_task = Task(
        description=(
            "Using the audience and requirements in your context, return only a "
            "Risk heading, one risk sentence, and one mitigation sentence. Keep "
            "each sentence to at most 18 words."
        ),
        expected_output="A Risk heading with one risk and one mitigation.",
        agent=risk_agent,
        context=[audience_task, requirements_task],
    )

    brief_task = Task(
        description=(
            "Create a release brief from all prior task outputs. Return only these "
            "sections: Audience with one sentence; Requirements with two numbered "
            "items; Risk with one risk and one mitigation. Keep the exact headings "
            "Audience, Requirements, and Risk."
        ),
        expected_output=(
            "A concise release brief with Audience, Requirements, and Risk headings."
        ),
        agent=editor_agent,
        context=[audience_task, requirements_task, risk_task],
    )

    crew = Crew(
        agents=[
            audience_agent,
            requirements_agent,
            risk_agent,
            editor_agent,
        ],
        tasks=[audience_task, requirements_task, risk_task, brief_task],
        process=Process.sequential,
        verbose=False,
    )

    result = crew.kickoff()

    for index, task_output in enumerate(result.tasks_output, start=1):
        print(f"\n--- Task {index} ---\n{task_output.raw}")
    ```

    에이전트에는 도구가 없고 위임할 수 없으며 한 번에 하나씩 실행됩니다. 첫 번째 이후의 모든 Task는 `context`에서 앞선 Task를 선언하므로, CrewAI는 해당 이전 출력을 다음 Task에 포함합니다.
  </Step>

  <Step title="Crew 실행">
    동일한 셸 세션에서 예제를 실행하세요:

    ```bash theme={null}
    uv run python crew.py
    ```

    스크립트는 최종 릴리스 브리프를 포함한 네 개의 Task 출력을 모두 출력합니다.
  </Step>
</Steps>

## 라우트 매핑

| CrewAI 구성                                       | CometAPI 라우트                                  | 기본 URL                        |
| ----------------------------------------------- | --------------------------------------------- | ----------------------------- |
| `custom_openai=True`, `api="completions"`       | `POST /v1/chat/completions`                   | `https://api.cometapi.com/v1` |
| `custom_openai=True`, `api="responses"`         | `POST /v1/responses`                          | `https://api.cometapi.com/v1` |
| `anthropic/` 모델 접두사                             | `POST /v1/messages`                           | `https://api.cometapi.com`    |
| `gemini/` 모델 접두사 및 `client_params.http_options` | `POST /v1beta/models/{model}:generateContent` | `https://api.cometapi.com`    |

위의 두 OpenAI 구성에서는 `/v1`에 `base_url` 접미사가 필요합니다. Anthropic 및 Gemini 구성은 자체 버전 지정 라우트를 추가하므로, 기본 URL은 `/v1` 없이 CometAPI 오리진을 사용합니다.

## 모델 ID 선택

다음 [CometAPI 모델 페이지](/ko/overview/models) 에서 각 전송에 사용할 텍스트 모델 ID 하나를 선택하세요. Python 파일을 편집하지 않고 변경할 수 있도록 모델 ID를 환경 변수에 저장하세요. 환경 변수에 제공업체 접두사를 추가하지 마세요. 이 예제에서는 CrewAI가 제공업체 선택에 해당 접두사를 사용하는 위치에 `anthropic/` 및 `gemini/`을 추가합니다.

## 문제 해결

<AccordionGroup>
  <Accordion title="Anthropic 또는 Gemini 제공업체 가져오기 실패">
    프로젝트에서 `uv add 'crewai[anthropic,google-genai]'`를 실행하세요. 기본 CrewAI 패키지는 기본적으로 두 선택적 제공업체 SDK를 모두 설치하지 않습니다.
  </Accordion>

  <Accordion title="Responses 요청에서 매개변수 오류가 반환됨">
    선택한 모델의 인터페이스에 포함되지 않은 선택적 매개변수를 제거하세요. 이 예제는 Responses에 대해 출력 토큰 제한만 구성합니다.
  </Accordion>

  <Accordion title="요청이 잘못된 라우트를 사용함">
    `LLM` 구성을 라우트 매핑 표와 비교하세요. 특히 올바른 `custom_openai=True` 값과 함께 `api`를 사용하고, Gemini 기본 URL은 `client_params.http_options` 내부에 유지하세요.
  </Accordion>
</AccordionGroup>

## 관련 리소스

* [CrewAI 1.15.12 LLM 문서](https://docs.crewai.com/v1.15.12/en/concepts/llms)
* [CrewAI 에이전트](https://docs.crewai.com/v1.15.12/en/concepts/agents)
* [CrewAI 작업](https://docs.crewai.com/v1.15.12/en/concepts/tasks)
* [CrewAI 크루](https://docs.crewai.com/v1.15.12/en/concepts/crews)
* [CometAPI 채팅 완성](/ko/api/text/chat)
* [CometAPI 응답](/ko/api/text/responses)
* [CometAPI Anthropic 메시지](/ko/api/text/anthropic-messages)
* [CometAPI Gemini generateContent](/ko/api/text/gemini-generating-content)

<script type="application/ld+json">
  {`
    {
    "@context": "https://schema.org",
    "@graph": [
      {
        "@type": "HowTo",
        "@id": "https://apidoc.cometapi.com/integrations/crewai#howto",
        "name": "CometAPI와 함께 CrewAI 사용하기",
        "description": "하나의 순차적 멀티 에이전트 Crew에서 CometAPI와 함께 네 가지 CrewAI LLM 전송 구성을 사용합니다.",
        "step": [
          {
            "@type": "HowToStep",
            "@id": "https://apidoc.cometapi.com/integrations/crewai#step-1",
            "position": 1,
            "name": "프로젝트 생성 및 CrewAI 설치",
            "text": "uv 프로젝트를 만들고 Anthropic 및 Google Gen AI 추가 구성 요소와 함께 CrewAI를 설치합니다."
          },
          {
            "@type": "HowToStep",
            "@id": "https://apidoc.cometapi.com/integrations/crewai#step-2",
            "position": 2,
            "name": "API 키 및 모델 ID 설정",
            "text": "CometAPI API 키와 각 전송에 사용할 현재 모델 ID 하나를 설정합니다."
          },
          {
            "@type": "HowToStep",
            "@id": "https://apidoc.cometapi.com/integrations/crewai#step-3",
            "position": 3,
            "name": "순차적 Crew 생성",
            "text": "순차적 Crew에서 4개의 LLM 어댑터, 4개의 에이전트 및 컨텍스트로 연결된 4개의 Task를 구성합니다."
          },
          {
            "@type": "HowToStep",
            "@id": "https://apidoc.cometapi.com/integrations/crewai#step-4",
            "position": 4,
            "name": "Crew 실행",
            "text": "Crew를 실행하고 네 개의 Task 출력을 모두 검토합니다."
          }
        ]
      },
      {
        "@type": "BreadcrumbList",
        "itemListElement": [
          {
            "@type": "ListItem",
            "position": 1,
            "name": "CometAPI 문서",
            "item": "https://apidoc.cometapi.com/"
          },
          {
            "@type": "ListItem",
            "position": 2,
            "name": "통합",
            "item": "https://apidoc.cometapi.com/integrations"
          },
          {
            "@type": "ListItem",
            "position": 3,
            "name": "CometAPI와 함께 CrewAI 사용하기",
            "item": "https://apidoc.cometapi.com/integrations/crewai"
          }
        ]
      }
    ]
    }
    `}
</script>
