Provider 셋의 봉투를 나란히 깔아놓으면 표가 짧아져. 차이는 대부분 겉모습이고, 진짜는 몇 개 안 돼.
| Concept | OpenAI | Anthropic | Gemini |
|---|---|---|---|
| Tool 리스트 필드 | tools | tools | tools (config 안) |
| Schema 필드 | parameters | input_schema | parameters (Schema object) |
| 인자 타입 | JSON 문자열 | dict | dict |
| Tool choice | "auto"|"required"|지목 | type: "auto"|"any"|"tool" | FunctionCallingMode enum |
| 종료 신호 | response.completed + output[].type | stop_reason | function_call part 유무 |
| Tool 인자 streaming | 조각으로 | 조각으로 (content block 단위) | 통째로 한 번에 |
| 기본 제공 native tool | web_search, code_interpreter, file_search | computer_use, text_editor, bash | code_execution, google_search |
| MCP 연동 | Apps SDK 를 거쳐 | Messages API 의 mcp_servers 로 | Vertex AI tool config 로 |
겉모습이 아니라 진짜 차이인 칸은 넷이야. 인자 타입 (parse 해야 하느냐 그냥 쓰느냐), streaming 동작 (조각으로 오느냐 한 번에 오느냐), 기본 제공 tool (provider 마다 자기만의 무기가 있어), 그리고 MCP 연동 방식. 겉모습 차이는 얇은 번역층으로 덮고, 진짜 차이 앞에서는 provider 별 코드가 갈리는 걸 그냥 받아들여.
유혹은 셋이 다 같은 척 거대한 추상을 짓는 거야. 버틸 수 있는 데까지 버텨. '메시지랑 tool 을 보내고, tool call 을 받고, 결과를 돌려준다' 는 모양 자체가 이미 충분히 작은 추상이거든. 여기서 더 덮으면 진짜 차이를 가리게 되고, 결국 아무도 관리하지 않는 SDK 짝퉁 하나가 남아.