TRENDSHIFT · 2026.06.15

aisuite 딥다이브
— 문자열 하나만 바꾸면 LLM 공급자가 갈리는 "통합 어댑터"의 설계

aisuite는 Andrew Ng(앤드류 응)이 이끄는 팀이 만든 파이썬 라이브러리로, OpenAI·Anthropic·Google·Mistral·Ollama 등 20개가 넘는 LLM 공급자하나의 OpenAI 스타일 API로 감싼다. model="openai:gpt-4o""anthropic:claude-..."문자열만 바꾸면 같은 코드가 다른 회사 모델로 흐른다. 그 위에는 도구 호출·툴킷·MCP를 갖춘 Agents API가, 다시 그 위에는 데스크탑 AI 동료 앱 OpenCoworker가 올라간 3층 구조다. (저장소: andrewyng/aisuite · Python 3.10+ · MIT 라이선스 · Poetry · v0.1.14)

이 문서는 README를 베끼는 대신 provider.py·client.py·각 공급자 어댑터 소스를 직접 읽어 "멀티 공급자 추상화 레이어를 어떻게 설계하는가"에 초점을 둔 해설이다.
목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 시스템 / 환경 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

이 레포가 무엇을 하는 물건인가.

핵심 메시지

"각 LLM 회사가 제각각 만든 SDK를,
OpenAI 스타일 API 하나로 통역해 주는 만능 어댑터."

나라마다 콘센트 모양이 다르듯, OpenAI·Anthropic·Google·Mistral은 SDK 호출 방식·요청/응답 형태가 전부 다르다. aisuite는 "멀티 어댑터"처럼, 코드는 늘 OpenAI 형식 한 가지로 짜되 내부에서 각 공급자의 SDK로 변환해 꽂아 준다.

덕분에 client.chat.completions.create(model="openai:gpt-4o", ...) 한 줄에서 model 문자열의 접두사(openai:, anthropic:)만 바꾸면 호출 대상이 다른 회사 모델로 즉시 바뀐다. 모델 비교·A/B 테스트·공급자 종속(lock-in) 탈출이 한 줄로 끝난다.

aisuite유니폼 액세스 레이어(uniform access layer)를 표방하는 경량 라이브러리다. 두 개의 층으로 나뉜다 — ① 공급자 간 통일된 Chat Completions API, ② 그 위에서 모델에게 파이썬 함수를 도구로 쥐여 주는 Agents API. 여기에 같은 저장소에서 두 층을 실제로 써먹는 데스크탑 앱 OpenCoworker까지 함께 배포된다. 핵심 패키지(aisuite/)는 순수 파이썬이며, 공급자 SDK는 모두 선택적(optional) 의존성이라 필요한 것만 골라 설치한다(pip install 'aisuite[anthropic]').

용어
추상화 레이어 (abstraction layer)
서로 다른 하위 구현(여기서는 각 LLM 회사 SDK)들을 하나의 공통 인터페이스 뒤에 숨겨, 사용하는 쪽 코드가 구체적 차이를 신경 쓰지 않게 하는 설계. aisuite의 존재 이유 그 자체다.
용어
공급자 종속 (vendor lock-in)
특정 회사의 API/SDK에 코드가 깊이 묶여, 다른 회사로 갈아타는 비용이 커지는 상태. aisuite는 호출부를 표준화해 이 종속을 "model 문자열 한 줄"로 낮춘다.

2왜 주목받는가

트렌딩 이유 · LiteLLM 등 경쟁 대비 장점.

멀티 공급자 통합 라이브러리는 이미 여럿(LiteLLM, LangChain 등) 있다. aisuite가 빠르게 주목받은 이유는 셋이다. 첫째 Andrew Ng이라는 강력한 브랜드와 "최소한의 추상화" 철학, 둘째 OpenAI SDK를 그대로 베낀 친숙한 표면(surface), 셋째 단순 채팅을 넘어 Agents API·MCP·OpenCoworker 앱까지 한 저장소에서 위로 쌓아 올린 점이다.

비교 항목직접 각 SDK 사용aisuite
공급자 전환호출 코드 전체 재작성model 문자열 접두사만 변경
학습 곡선SDK마다 다른 API 학습OpenAI 형식 하나만 알면 됨
의존성필요 SDK 직접 관리extras로 고른 공급자만 설치
도구 호출SDK별 다른 tool 스키마 직접 작성파이썬 함수를 넘기면 스키마 자동 생성
에이전트 루프직접 구현(요청→실행→결과 회신 반복)max_turns 한 줄 또는 Agents API
MCP별도 통합 작업네이티브 지원(config dict 또는 MCPClient)
실사용 예스스로 앱 작성OpenCoworker(데스크탑 AI 동료) 참조 구현 동봉
기존 방식의 한계
"각 SDK를 직접 호출"의 함정 — 응답 형태가 모두 다르다

OpenAI는 response.choices[0].message.content로 답을 꺼내지만, Anthropic은 content 블록 배열, finish_reasonend_turn/tool_use처럼 이름이 다르다. 도구 호출(tool calling) 메시지 형식, tool_result 회신 방식까지 전부 제각각이라, 공급자를 바꾸면 요청 만들기·응답 파싱·도구 루프를 모두 다시 짜야 한다.

aisuite의 해결
"어댑터 + 응답 정규화" — 들어올 때 변환, 나갈 때 정규화

각 공급자 어댑터는 ① 들어오는 OpenAI 형식 메시지를 그 회사 형식으로 변환(convert_request)하고, ② 돌아온 응답을 다시 OpenAI 형식으로 정규화(convert_response)한다. 그래서 호출부는 어떤 공급자든 response.choices[0].message.content로 일관되게 답을 꺼낸다. "차이는 어댑터 안에 가두고, 바깥은 항상 같은 모양"이 설계 철학이다.

3기술 스택 전체 지도

코어 라이브러리·공급자 SDK·에이전트/인프라 각각.

① 코어 라이브러리 (백엔드) — 순수 파이썬 추상화

코어는 외부 의존성이 거의 없다. 공급자 SDK들은 전부 optional이라, 코어 자체는 pydantic·httpx·docstring-parser 정도만 필수로 요구한다. 무거운 SDK를 강제하지 않는 것이 "경량(lightweight)"의 핵심.

요소역할
Python 3.10+전체 언어. 타입힌트·dataclass·Protocol 적극 사용.
importlib (표준)동적 공급자 로딩의 핵심. 이름 규칙으로 모듈을 런타임에 import.
pydantic v2응답 모델·검증. 프레임워크 데이터 구조 정의.
docstring-parser파이썬 함수의 docstring을 읽어 도구 스키마 자동 생성.
httpxHTTP 클라이언트(일부 공급자·트레이싱 뷰어).

② 공급자 SDK (선택 설치) — extras로 골라 담기

pyproject.toml[tool.poetry.extras]에 공급자별 설치 그룹이 정의돼 있다. pip install 'aisuite[all]'로 전부, 또는 aisuite[anthropic]처럼 하나만 설치한다.

공급자(extras)내부에서 쓰는 SDK
openaiopenai — 표면 API의 기준점.
anthropicanthropic — Claude.
googlevertexai, google-cloud-speech — Gemini·STT.
awsboto3 — Bedrock.
mistral / cohere / groq각 회사 공식 SDK.
ollama / lmstudio / deepseekopenai SDK 재사용 — OpenAI 호환 엔드포인트라서.
watsonx / cerebrasIBM watsonx · Cerebras 클라우드.
deepgram음성 인식(ASR) — soundfile·scipy·numpy 동반.
mcpmcp·nest-asyncio — Model Context Protocol 도구.
postgrespsycopg — 에이전트 상태 저장소(Postgres).
용어
OpenAI 호환 엔드포인트 (OpenAI-compatible API)
OpenAI와 같은 요청/응답 형식을 흉내 내는 API. Ollama·LM Studio·DeepSeek 등이 제공한다. 이 경우 aisuite는 별도 어댑터를 쓰지 않고 OpenAI SDK에 base_url만 바꿔 꽂는다 — 코드 재사용의 정석.

③ 에이전트 · 인프라 · 앱

요소역할
Agents APIAgent·Runner·ToolPolicy — 도구·정책·상태 저장·트레이싱.
Toolkitsfiles·git·shell — 샌드박스된 도구 묶음(바로 붙이는 능력).
MCPMCPClient — 외부 MCP 서버 도구를 모델에 연결.
상태 저장소in-memory · 파일 · Postgres — 실행 중단/재개·대화 영속화.
Tracing 뷰어에이전트가 거친 모든 단계를 시각화하는 정적 viewer 동봉.
OpenCoworkerplatform/ — aisuite로 만든 데스크탑 AI 동료(앱). macOS·Windows 빌드.
패키징Poetry(pyproject.toml+poetry.lock) · PyPI 배포.

4아키텍처 심화 분석

model 문자열 → 동적 어댑터 로딩 → 변환/정규화, 그리고 도구 루프.

전체 흐름 한눈에 — 3층 + 어댑터

호출부는 model="provider:model-name" 문자열을 넘긴다. Client는 콜론 앞부분(provider)을 키로 삼아, ProviderFactory이름 규칙으로 해당 어댑터 모듈을 런타임에 import하고 인스턴스를 만든다. 그 어댑터가 요청을 그 회사 SDK 형식으로 변환해 호출하고, 응답을 다시 OpenAI 형식으로 정규화해 돌려준다.

코드 (당신) │ client.chat.completions.create(model="anthropic:claude-...", messages=...) ▼ ┌──────────────────────── Chat Completions API ────────────────────────┐ │ Client → Chat → Completions │ │ 1) model 문자열을 "provider" : "model-name" 으로 분리 │ │ 2) provider 키로 ProviderFactory.create_provider() 호출 │ └───────────────────────────────┬──────────────────────────────────────┘ │ ════════ ProviderFactory (동적 로딩의 심장) ════════ provider_key = "anthropic" 모듈명 = "anthropic_provider" (이름 규칙) 클래스명 = "AnthropicProvider" (Capitalize + Provider) importlib.import_module( "aisuite.providers.anthropic_provider") getattr(module, "AnthropicProvider")(**config) ═══════════════════════╤═════════════════════════════ ▼ ┌──────────────── 공급자 어댑터 (Provider 서브클래스) ───────────────┐ │ chat_completions_create(model, messages, **kwargs) │ │ ┌─ convert_request : OpenAI 형식 → 그 회사 형식 │ │ │ (예: system 메시지 분리, tool_result 블록 변환) │ │ ▼ │ │ 회사 공식 SDK 호출 (anthropic / openai / boto3 / vertexai ...) │ │ ▲ │ │ └─ convert_response : 회사 응답 → OpenAI 형식으로 정규화 │ │ finish_reason 매핑 (end_turn→stop, tool_use→tool_calls) │ │ ChatCompletionResponse(choices[0].message, usage ...) │ └───────────────────────────────┬───────────────────────────────────┘ ▼ response.choices[0].message.content ← 공급자 무관 동일 형태 │ ┌────────────────────────────────▼─────────────────────────────────┐ │ (선택) max_turns 설정 시 도구 루프: │ │ 모델이 tool_calls 요청 → 파이썬 함수 실행 → 결과를 다시 회신 │ │ → 모델 재호출 ... 대화 끝날 때까지 반복 │ └───────────────────────────────────────────────────────────────────┘

핵심 ① 동적 공급자 로딩 — "if-else 분기"가 아니라 "이름 규칙"

aisuite의 가장 우아한 부분이다. 공급자가 20개가 넘는데도, 코드 어디에도 if provider == "openai": ... elif "anthropic": ... 같은 거대한 분기가 없다. 대신 파일 이름과 클래스 이름의 규칙으로 어댑터를 찾아낸다.

provider.py — ProviderFactory 핵심 (요약)
class ProviderFactory:
    PROVIDERS_DIR = Path(__file__).parent / "providers"

    @classmethod
    def create_provider(cls, provider_key, config):
        # "anthropic" → 클래스 "AnthropicProvider"
        provider_class_name  = f"{provider_key.capitalize()}Provider"
        # "anthropic" → 모듈 "anthropic_provider"
        provider_module_name = f"{provider_key}_provider"
        module_path = f"aisuite.providers.{provider_module_name}"

        module = importlib.import_module(module_path)   # 런타임 import
        provider_class = getattr(module, provider_class_name)
        return provider_class(**config)

    @classmethod
    @functools.cache
    def get_supported_providers(cls):
        # providers/ 폴더의 *_provider.py 파일을 스캔해 목록 생성
        provider_files = Path(cls.PROVIDERS_DIR).glob("*_provider.py")
        return {f.stem.replace("_provider", "") for f in provider_files}

새 공급자를 추가하려면 코드 수정 없이 providers/foo_provider.py 파일에 FooProvider 클래스만 넣으면 끝이다. 지원 목록조차 폴더 스캔으로 자동 산출된다. 이것이 컨벤션 기반 플러그인 발견(convention over configuration) 패턴이다.

용어
팩토리 패턴 (Factory Pattern) + 동적 import
객체 생성 책임을 별도 "공장" 클래스에 위임하는 디자인 패턴. aisuite는 여기에 importlib필요한 어댑터만 그때그때 로딩하는 지연 로딩(lazy loading)을 더했다 — 설치하지 않은 공급자 SDK는 import조차 안 되니 가볍다.

핵심 ② 어댑터 패턴 — 변환(in)과 정규화(out)

각 어댑터는 Provider 추상 클래스를 상속해 chat_completions_create 하나만 구현하면 된다. 예를 들어 Anthropic 어댑터의 AnthropicMessageConverter는 OpenAI 형식과 Anthropic 형식 사이를 양방향 통역한다.

차이점OpenAI 형식Anthropic 형식어댑터가 하는 일
system 메시지messages[] 안의 한 항목별도 system 파라미터분리해서 따로 전달
도구 결과role:"tool" 메시지tool_result 콘텐츠 블록블록 형태로 재구성
종료 사유stop/length/tool_callsend_turn/max_tokens/tool_useFINISH_REASON_MAPPING으로 역매핑
비유 — 어댑터의 양방향 통역

aisuite 어댑터는 "동시통역사"다. 당신(코드)이 한국어(OpenAI 형식)로 질문하면, 통역사가 그걸 상대방 언어(Anthropic 형식)로 옮겨 전하고, 상대 답변을 다시 한국어로 옮겨 당신에게 준다. 당신은 끝까지 한국어만 쓰면 된다 — 상대가 영어를 쓰든 일어를 쓰든. 통역사(어댑터)를 한 명 더 고용하면(파일 하나 추가) 새 언어(공급자)가 지원된다.

핵심 ③ 도구 호출 자동화 — 함수를 넘기면 스키마가 생긴다

OpenAI 도구 호출은 원래 JSON 스키마를 손으로 적어야 한다. aisuite는 docstring-parser파이썬 함수의 시그니처와 docstring을 읽어 스키마를 자동 생성한다. max_turns를 주면 "모델 호출 → 도구 실행 → 결과 회신 → 재호출"의 루프까지 라이브러리가 돌려 준다.

함수 → 도구 (max_turns 루프)
def will_it_rain(location: str, time_of_day: str):
    """비가 올지 확인한다.
    Args:
        location (str): 도시 이름
        time_of_day (str): HH:MM 형식 시각
    """
    return "YES"

response = client.chat.completions.create(
    model="openai:gpt-4o",
    messages=[{"role":"user","content":"2시에 소풍 가도 될까?"}],
    tools=[will_it_rain],   # 파이썬 함수 그대로! 스키마 자동 생성
    max_turns=2)            # 도구 왕복 최대 2회까지 자동

response.choices[0].intermediate_messages에 도구 왕복 전체 기록이 담겨, 이어서 대화를 계속할 수 있다.

5디렉토리 구조 해부

코어 패키지 aisuite/ + 에이전트 + 데스크탑 앱 platform/.

aisuite/ (저장소 루트) ├── aisuite/ ★ 코어 파이썬 패키지 │ ├── client.py ★ Client / Chat / Completions — 진입점·도구 루프·MCP 처리 │ ├── provider.py ★ Provider(ABC) · ProviderFactory(동적 로딩) · Audio·ASR │ ├── providers/ ★ 공급자 어댑터 모음 (이름 규칙: <provider>_provider.py) │ │ ├── openai_provider.py 기준점(표면 API의 원형) │ │ ├── anthropic_provider.py Claude + 양방향 메시지 컨버터 │ │ ├── google_provider.py Gemini(vertexai) │ │ ├── aws_provider.py Bedrock(boto3) │ │ ├── ollama_provider.py OpenAI 어댑터 상속 + base_url만 교체 │ │ ├── deepseek_provider.py OpenAI SDK 재사용(호환 엔드포인트) │ │ ├── message_converter.py OpenAICompliantMessageConverter(공통) │ │ └── ... (groq·mistral·cohere·xai·together·nebius 등 20+) │ ├── framework/ ★ 공급자 무관 데이터 모델 │ │ ├── chat_completion_response.py ChatCompletionResponse(정규화 결과) │ │ ├── message.py / choice.py Message·Choice·ToolCall·Usage │ │ ├── provider_interface.py 공급자 인터페이스 규약 │ │ └── asr_params.py / parameter_mapper.py 음성 파라미터 매핑 │ ├── agents/ ★ Agents API │ │ ├── runner.py Runner.run / run_sync — 에이전트 실행 루프 │ │ ├── types.py Agent·RunResult·RunState·ToolPolicy(dataclass) │ │ ├── policies.py RequireApprovalPolicy·allow/deny │ │ ├── state_store.py 실행 상태 영속화 인터페이스 │ │ ├── postgres_state_store.py Postgres 구현(중단/재개) │ │ ├── artifact_store.py / artifacts.py 산출물 캡처 │ │ └── viewer.py 트레이싱 뷰어 연동 │ ├── toolkits/ ★ 바로 붙이는 도구 묶음 │ │ ├── files.py · git.py · shell.py 샌드박스 도구 패밀리 │ ├── mcp/ MCP 클라이언트(config dict·HTTP·stdio) │ ├── tracing/ 실행 추적 + 정적 viewer(static/) │ └── utils/tools.py 함수→도구 스키마 변환(docstring 파싱) ├── platform/ ★ OpenCoworker (데스크탑 AI 동료 앱) │ ├── coworker/ 에이전트 하베스(harness) 본체 │ ├── surfaces/ UI 표면 │ └── packaging/ macOS·Windows 빌드 ├── aisuite-js/ TypeScript/JS 포트 ├── examples/ 노트북·CLI·tool_calling·MCP 예제 다수 ├── tests/ pytest (integration·llm·mcp_server 마커) ├── docs/ · guides/ 퀵스타트·가이드 ├── pyproject.toml / poetry.lock Poetry 패키징(extras로 공급자 선택) └── README.md / CONTRIBUTING.md
읽는 순서 추천

provider.pyProviderFactory로 "어떻게 어댑터를 찾나"(동적 로딩) → ② providers/anthropic_provider.py로 변환/정규화 실물 → ③ providers/ollama_provider.py로 "OpenAI 어댑터 상속해 base_url만 바꾸는" 재사용 패턴 → ④ client.py로 도구 루프·MCP 처리 → ⑤ agents/types.py·runner.py로 Agents 층. 설계의 통찰은 ①②③에 거의 다 있다.

6학습 포인트 (기술별)

멀티 공급자 추상화 라이브러리에서 무엇을 배우나.

A. 동적 플러그인 로딩 — 분기 대신 컨벤션

aisuite는 "확장 가능한 플러그인 시스템을 어떻게 만드나"의 살아 있는 교과서다. 핵심은 ① importlib.import_module이름 규칙 기반 동적 로딩, ② 폴더 스캔(glob("*_provider.py"))으로 지원 목록 자동 산출, ③ 추상 베이스 클래스(Provider(ABC))로 계약 강제. 새 기능 추가가 "거대한 if-else 수정"이 아니라 "규칙에 맞는 파일 하나 추가"로 끝난다.

실습: "handlers/ 폴더의 *_handler.py를 스캔해, 파일명으로 핸들러 클래스를 동적 로딩하는" 30줄짜리 미니 팩토리를 직접 짜 보라. importlib+getattr+functools.cache 조합을 그대로 따라해 본다.

B. 어댑터 패턴 — 차이를 어댑터 안에 가두기

서로 다른 외부 API를 하나의 인터페이스로 묶는 전형적 어댑터/파사드 패턴이다. 배울 점은 "공통 데이터 모델을 먼저 정하고(=framework/), 각 어댑터가 그 모델로 변환/정규화한다"는 방향이다. 호출부는 ChatCompletionResponse라는 한 가지 모델만 알면 된다. 외부 시스템을 여럿 붙이는 모든 통합 작업에 그대로 옮길 수 있다.

실습: 가짜 "공급자" 2개(서로 다른 dict 응답 형태)를 만들고, 각각을 공통 Response dataclass로 정규화하는 어댑터를 작성하라. 호출부가 두 공급자를 구분 없이 쓸 수 있게 만들기.

C. 코드 재사용 — 상속으로 호환 엔드포인트 흡수

OllamaProvider(OpenaiProvider)처럼, OpenAI 호환 엔드포인트는 어댑터를 새로 안 짜고 OpenAI 어댑터를 상속해 base_url만 교체한다. DeepSeek도 OpenAI SDK를 그대로 쓴다. "호환 표준이 있으면 바퀴를 다시 만들지 말라"는 실용주의의 모범. __init__에서 config를 살짝 손보는 것만으로 새 공급자가 생긴다.

실습: ollama_provider.py를 읽고, "왜 native /api/chat가 아니라 /v1(OpenAI 호환)을 쓰는가"를 한 문단으로 설명하라(힌트: 도구 호출·finish_reason 흐름).

D. 의존성 설계 — optional extras로 가볍게

코어는 무거운 SDK를 강제하지 않는다. pyproject.toml[tool.poetry.extras]"필요한 공급자만 설치"를 가능하게 했다. 라이브러리 저자라면 반드시 알아야 할 패턴 — 사용자에게 불필요한 의존성을 떠넘기지 않는 것. import 실패 시 친절한 에러로 "pip install 'aisuite[mcp]'"를 안내하는 점도 배울 만하다.

실습: 본인 라이브러리에 [project.optional-dependencies](또는 poetry extras)를 정의하고, 미설치 시 try/except ImportError로 "설치 명령을 알려 주는" 폴백을 구현하라.

7시스템 / 환경 요구사항

라이브러리는 가볍다 — 진짜 요구사항은 "API 키".

항목요구사항
런타임Python 3.10 이상. pip install aisuite 한 줄(코어).
공급자 SDK호출할 공급자만 extras로: aisuite[anthropic] / aisuite[all].
API 키각 공급자의 키(OPENAI_API_KEY·ANTHROPIC_API_KEY 등). 환경 변수 또는 provider_configs로 주입.
로컬 모델Ollama(http://localhost:11434) / LM Studio — 키 없이 로컬 추론.
MCP 도구aisuite[mcp] + 외부 MCP 서버(예: npx @modelcontextprotocol/server-filesystem).
에이전트 상태(Postgres)aisuite[postgres] + PostgreSQL 인스턴스(중단/재개용).
OpenCoworker 앱macOS 13+(Apple Silicon) 또는 Windows 10/11(x64). 본인 API 키 지참 또는 Ollama 로컬.
팁 — 비용·보안
키 관리와 로컬 폴백

클라우드 모델은 토큰당 과금된다. 개발·테스트는 Ollama 로컬 모델로 같은 코드를 무료로 돌리다가, 운영에서만 model 문자열을 클라우드 모델로 바꾸는 전략이 가능하다 — aisuite 추상화의 실질적 이득. 키는 코드에 하드코딩하지 말고 환경 변수(.env+python-dotenv)로 관리하라(레포의 .env.sample 참고).

8직접 해볼 수 있는 실습 과제

난이도별 5단계 — 동일 코드로 공급자 갈아 끼우기부터 에이전트까지.

과제 1 난이도 ★☆☆☆☆

한 줄로 공급자 바꿔 보기

pip install 'aisuite[openai,ollama]' 후, 같은 messagesmodel="ollama:llama3""openai:gpt-4o-mini"를 번갈아 호출해 응답을 비교한다. 바뀐 코드가 model 문자열 하나뿐임을 확인하는 것이 목적.

과제 2 난이도 ★★☆☆☆

같은 프롬프트, 여러 모델 벤치

모델 리스트(["openai:...","anthropic:...","ollama:..."])를 for 루프로 돌려 같은 질문에 대한 답·응답 시간(time)·토큰 사용량(response.usage)을 표로 출력한다. aisuite가 usage까지 정규화해 줌을 체감.

과제 3 난이도 ★★★☆☆

도구 호출 자동 루프

파이썬 함수 2~3개(예: 날씨 조회·계산기)를 정의해 tools=[...]로 넘기고 max_turns=3으로 실행, 모델이 함수를 호출·결과를 받아 최종 답을 만드는 과정을 관찰한다. response.choices[0].intermediate_messages로 도구 왕복 기록을 들여다본다.

과제 4 난이도 ★★★★☆

나만의 공급자 어댑터 추가

providers/myecho_provider.py를 만들어 MyechoProvider(Provider)를 구현(입력 메시지를 그대로 에코해 ChatCompletionResponse로 반환)하고, model="myecho:test"로 호출한다. 코드를 한 줄도 안 고치고 새 공급자가 인식됨을 확인 — 동적 로딩의 위력 체감.

과제 5 난이도 ★★★★★

Agents API + 툴킷으로 미니 코드 도우미

Agent(tools=[*ai.toolkits.files(root="."), *ai.toolkits.git(root=".")])를 만들고 Runner.run(agent, "최근 커밋 변경점을 3줄로 요약")을 실행한다. RequireApprovalPolicy로 위험한 도구 호출에 승인 게이트를 걸고, Postgres 상태 저장소로 실행을 중단·재개해 본다.

9관련 기술 심화 학습 로드맵

6주 코스 — LLM API 기초부터 에이전트 하베스 설계까지.

주차주제실습 · 참고
1주차LLM API 기초 — OpenAI Chat Completions 형식·messages·파라미터OpenAI 공식 문서 · aisuite 단일 호출 실습(과제 1)
2주차추상화/어댑터 패턴 — 공통 모델 vs 공급자 차이provider.py·anthropic_provider.py 정독 · 과제 4
3주차동적 로딩·플러그인 시스템 — importlib·컨벤션·extrasProviderFactory 분석 · pyproject.toml extras 설계
4주차도구 호출(function calling) — 스키마 자동화·도구 루프utils/tools.py · max_turns 동작 추적(과제 3)
5주차에이전트 설계 — Runner·정책·상태 저장·트레이싱agents/runner.py·types.py·policies.py
6주차MCP·에이전트 하베스 — 외부 도구 연결·OpenCoworker 구조mcp/ · platform/coworker/ · agents-quickstart

10핵심 키워드 사전

본문·소스에 나온 용어 빠른 참조.

용어의미
uniform access layer여러 LLM 공급자를 하나의 API로 통일하는 층. aisuite의 정체성.
Provider (어댑터)한 공급자의 SDK를 감싸 변환/정규화하는 클래스. Provider(ABC) 상속.
ProviderFactory이름 규칙으로 어댑터를 동적 로딩·생성하는 팩토리.
model 문자열"provider:model-name" 형식. 콜론 앞이 공급자 키.
convert_request / convert_responseOpenAI 형식 ↔ 공급자 형식 양방향 변환·정규화.
ChatCompletionResponse공급자 무관한 정규화된 응답 모델(framework/).
finish_reason 매핑end_turn→stop 등 종료 사유를 OpenAI 형식으로 역매핑.
extras (optional deps)aisuite[anthropic]처럼 필요한 공급자 SDK만 선택 설치.
OpenAI 호환 엔드포인트OpenAI 형식을 흉내 내는 API. Ollama·LM Studio·DeepSeek — OpenAI 어댑터 재사용.
tool calling모델이 파이썬 함수를 도구로 호출. aisuite는 스키마 자동 생성.
max_turns도구 호출 왕복(모델↔도구) 자동 반복 횟수 상한.
Agents APIAgent·Runner — 장기 실행·정책·상태·트레이싱.
Toolkitfiles·git·shell 같은 샌드박스 도구 묶음.
ToolPolicyRequireApprovalPolicy·allow/deny — 어떤 도구 호출을 실행할지 통제.
State Store실행 상태 영속화(메모리·파일·Postgres). 중단/재개·대화 영속.
MCPModel Context Protocol. 외부 도구 서버를 표준 방식으로 모델에 연결.
OpenCoworkeraisuite로 만든 데스크탑 AI 동료 앱(platform/). 참조 구현.

11참고 링크