Provider 셋 envelope 을 나란히 깔면 매트릭스 짧아져. 차이 대부분이 cosmetic, 몇 개만 진짜.
| Concept | OpenAI | Anthropic | Gemini |
|---|---|---|---|
| Tool 리스트 필드 | tools | tools | tools (config 안) |
| Schema 필드 | parameters | input_schema | parameters (Schema object) |
| Args 타입 | JSON 문자열 | dict | dict |
| Tool choice | "auto"|"required"|spec | type: "auto"|"any"|"tool" | FunctionCallingMode enum |
| Stop 신호 | response.completed + output[].type | stop_reason | function_call part 유무 |
| Streaming tool args | Delta | Delta (per content block) | 한 번에 |
| Pre-built native tool | web_search, code_interpreter, file_search | computer_use, text_editor, bash | code_execution, google_search |
| MCP integration | Apps SDK 경유 | Messages API mcp_servers 경유 | Vertex AI tool config 경유 |
차이가 cosmetic 아니고 진짜인 4 칸: args 타입 (parse vs use), streaming 동작 (delta vs 한 번에), pre-built tool (각 provider 가 unique offering), MCP integration 모양. Cosmetic 한 거엔 얇은 번역 layer; 진짜인 거엔 provider-specific 코드 받아들여.
유혹은 셋 다 같은 척 거대 abstraction 짓는 거. 가능한 한 오래 저항해. '메시지 + tool 보내고 tool call 받고 결과 보냄' 모양이 이미 작은 abstraction — over-abstract 하면 진짜 차이 가리고 아무도 maintain 안 하는 SDK 클론 만들어.