iOS 27 Siri AI는 앱을 어떻게 호출하는가? App Intents, AI Agent, JSON과 자동화 실행 가이드
사용자는 「A-1042를 찾아줘」라고 말한다. JSON을 다루는 쪽의 질문은 Siri가 잡담할 수 있는가이 아니다.그 문장이 적법한 Intent 파라미터가 되는가, 앱이 perform()에서 부작용을 실행하는가다.App Intents, AI Agent, JSON 데이터, 자동화 실행을 나눈다.
읽기 전 요약
| 개념 | 한 줄 | 어디에 떨어지는가 |
|---|---|---|
| App Intents | 앱이 시스템에 등록하는 호출 가능한 동작 | perform() + 파라미터 객체 |
| Siri AI | 한 문장을 Intent에 채우는 디스패처 | 디스패치만 한다. 부작용은 실행하지 않는다 |
| AI Agent | 다단계 도구 루프: 제안, 실행, 다시 읽기 | LanguageModelSession + Intents |
| JSON Schema | 파라미터와 상태의 런타임 구경 | 저장소의 소스 파일이지 Swift 부록이 아니다 |
분담을 먼저 기억한다. Siri는 객체를 전달하고, App Intents는 입구, Agent는 루프, Schema는 실행 전 게이트다. 넷을 「Siri가 앱을 열었다」로 납작하게 만들면, 다음 홉은 산문을 parse한다.
먼저 「앱 호출」을 바로 묻기
2026년 9월, iOS 27은 iPhone 18 시리즈와 함께 출고된다. 소프트웨어 구경은 WWDC 2026에서 정해졌다. 새 Siri는 LLM으로 재구축되고, SiriKit은 폐기되며, 서드파티 입구는 App Intents뿐이다. iPhone 18 AI는 얼마나 강한가은 「얼마나 강한가」를 썼다. 이 글은 한 가지만 쓴다——Siri가 당신의 앱을 어떻게 호출하는가.
「앱 호출」을 「화면을 열고 설명을 읽는다」로 이해하면 설계가 틀린다. 시스템이 하는 일은 한 문장을 듣고, Intent 이름을 고르고, 파라미터 객체를 채운 뒤 호스트의 perform()에 넘기는 것이다. 화면은 열리지 않아도 된다.
- 사용자가 말하는 것은 자연어다. 시스템이 넘기는 것은 객체여야 한다.
- Siri는 디스패처다. 조회, 환불, 발신은 여전히 당신 앱에 있다.
- 다단계 자동화는 또 하나의 채팅 창이 아니다. 적법한 Intent 호출을 여러 번 하는 것이다.
그래서 이 가이드는 실행 경로로 쓴다. 입구 → 파라미터 → Agent 루프 → Schema 게이트 → Shortcuts / Spotlight. 매 단계마다 같은 질문을 한다. 객체가 적법한가?
호출 경로: 한 문장이 perform()이 되기까지
옛 Siri는 문구 매칭과 SiriKit에 의존했다. 새 Siri는 슬롯을 채운다. 「A-1042」「이거 환불」「결제됐으면 환불」을 필드로 만들고, 이미 등록한 Intent에 전달한다.
성공한 호출은 적어도 네 홉을 지난다:
- 듣는다. 온디바이스 또는 Private Cloud Compute가 음성 / 텍스트를 의도로 만든다. 채팅 로그가 아니다.
- 누구를 고른다. 시스템은 보이는 App Intents 목록에서 이름을 고른다. 등록이 없으면 차례가 오지 않는다.
- 채운다. 엔티티, 화면의 View, Spotlight 인덱스가 파라미터 객체로 접힌다.
- 호스트가 실행한다. 당신의
perform()이 부작용을 돌리고 구조화된 결과를 돌려준다.
JSON으로 떨어뜨리면 LookupOrder 한 홉은 이와 가깝다:
{
"intent": "LookupOrder",
"app": "com.example.shop",
"source": "siri",
"parameters": {
"order_id": "A-1042"
}
}
source는 siri, shortcut, spotlight, agent일 수 있다. 입구는 달라도 객체 모양은 같아야 한다. 화면을 여는 것은 표현이지 호출 자체가 아니다.
App Intents: 새 Siri가 볼 수 있는 유일한 입구
WWDC 2026 이후, App Intents를 말하지 않는 앱을 새 Siri는 보지 않는다. SiriKit에는 2~3년 마이그레이션 창이 있지만, 새 능력은 Intents에만 실린다. 호출어, 사용자 어휘, 옛 intent definition 파일은 더 이상 주 경로가 아니다.
시스템에게 Intent는 디스패치 가능한 도구다. 이름, 파라미터 타입, 확인 필요 여부, UI를 열지, 어느 영역인지. Siri, Shortcuts, Spotlight, 온디바이스 Agent가 그 목록을 공유한다.
- Intent Schema: 시스템 영역(할 일, 사진, 통신, 커머스). 영역에 맞추면 Siri가 고정 호출어를 외울 필요가 없다.
- Entity Schema: 주문, 연락처, 파일이 Spotlight 의미 인덱스에 들어가고, 개인 맥락은 출처와 함께 돌아온다.
- View Annotations: 눈앞의 View를 엔티티로 표시한다. 「이거 환불」에 묶을 대상이 생긴다. ID를 다시 묻지 않는다.
- App Intents Testing: Siri / Shortcuts / Spotlight를 실제 시스템 경로에서 시험한다. 시험하는 것은 객체이지 광고 문구가 아니다.
Swift에서 AppIntent를 쓰면 시스템은 호출 가능한 설명을 본다. AI Agent 완전 가이드는 「모델이 제안하고 호스트가 실행한다」를 루프에 그린다. iOS에서 제안은 종종 Siri에서 오고, 실행은 항상 당신의 perform()에 있다.
앱을 여는 것은 표현의 하나일 뿐이다. 조회, 상태 변경, 앱 간 핸드오프는 파라미터가 적법하고 파괴적 동작의 확인을 선언했다면 백그라운드에서 끝날 수 있다.
파라미터는 JSON 객체이지, 호출어가 아니다
옛 경로는 자연어를 검색어로 취급했다. 새 경로는 자연어를 폼 채우기로 취급한다. 필드를 산문으로 두면 perform()이 다시 parse해야 한다. 디스패치의 이점을 버리는 것이다.
각 Intent에는 JSON Schema가 있어야 한다. Swift 타입은 투영이다. @Generable, 클라우드 Structured Outputs, 평가 세트, Swift가 아닌 클라이언트는 같은 소스를 가리켜야 한다.
LookupOrder의 최소 계약은 이렇게 쓸 수 있다:
{
"$id": "https://example.com/schemas/intents/lookup-order.json",
"type": "object",
"properties": {
"intent": { "const": "LookupOrder" },
"parameters": {
"type": "object",
"properties": {
"order_id": { "type": "string", "pattern": "^A-[0-9]{4,}$" }
},
"required": ["order_id"],
"additionalProperties": false
}
},
"required": ["intent", "parameters"]
}
키워드는 JSON Schema 튜토리얼에 있다. 속성 이름은 짧게, enum은 고정하고, 배열에는 maximumCount를 단다. AI가 JSON Schema가 필요한 이유는 이미 썼다. Schema는 구경이지, 프롬프트의 「JSON을 반환하라」가 아니다.
Siri가 잘못 채운 값, 만료된 엔티티, 여분 키는 당신 함수로 들어온다. Intent 선언을 조이고, 실행 전에 같은 Schema로 다시 검증한다. 디버그는 먼저 포맷로 구조를 보고, JSONPath 추출로 order_id를 뽑은 뒤, 지난주 통과한 객체와 JSON Diff한다. 사용자 주문을 공개 사이트에 붙이지 마라.
AI Agent: 자동화는 한 번의 Intent가 아니라 루프다
사용자는 한 단계로 끝나지 않는다. 「A-1042를 찾고, 결제됐으면 환불」은 먼저 LookupOrder를 한 뒤 CreateRefund를 결정한다. 그것이 Agent다. 제안, 실행, 결과 읽기, 다시 제안.
Apple 스택의 루프는 LanguageModelSession 안에 있다. 도구는 종종 App Intents이거나 시스템 OCR / Spotlight다. 뼈대는 클라우드 Function Calling과 같다. 모델은 이름과 인자만 내고, 호스트가 검증한 뒤 실행한다.
- 기본 목록은 시스템이 볼 수 있는 Intent이지, 혼자 유지하는 긴
tools[]가 아니다. - 각 홉의 입출력은 객체다. 스크린샷 산문을 다음 파라미터로 쓰면 안 된다.
- PCC는 약 32K다. 도구 결과가 창을 먼저 먹는다. 자른 뒤 session에 넣는다.
- 앱을 걸친 연결은 가능하다. 각 홉에는 적법한 파라미터와 각자의 확인 정책이 필요하다.
{
"agent": "on_device",
"goal": "refund_if_paid",
"plan": [
{
"step": 1,
"tool": "LookupOrder",
"arguments": { "order_id": "A-1042" }
},
{
"step": 2,
"tool": "CreateRefund",
"arguments": { "order_id": "A-1042", "reason": "duplicate" }
}
]
}
「결제됐으면 환불」의 최소 계획은 위 모양에 가깝다. 모델은 step 2를 제안할 수 있지만 호스트를 건너뛸 수 없다. status가 paid가 아니거나, amount가 범위를 벗어나거나, 확인이 없으면 CreateRefund를 실행하면 안 된다. AI Agent와 JSON Schema 워크플로는 게이트를 어떻게 나열하는지다. MCP Tool Schema vs Function Calling는 다른 도구 JSON 표기다. Apple은 같은 사전을 App Intents로 쓴다.
Siri와 Agent를 한 단어로 쓰지 마라. Siri는 「누구를 부를지」를 정한다. Agent는 「다음에 어떤 도구인지」를 정한다. 둘 다 객체를 바톤으로 넘긴다.
Schema는 실행 전 게이트이지, 문서 부록이 아니다
Guided Generation은 불법 토큰을 막는다. 권한, 한도, 두 번째 확인을 대신하지 않는다. Siri가 채운 파라미터에도 빠진 필드, 잘못된 enum, 만료된 엔티티가 남을 수 있다.
네 층을 「Siri가 똑똑해졌다」로 납작하게 만들면 책임이 사라진다. 나눈 뒤:
| 층 | 시스템이 하는 일 | Schema가 없으면 |
|---|---|---|
| Siri AI | 한 문장을 Intent 호출로 만든다 | 산문이 perform()에 들어가고 부작용이 먼저 돈다 |
| App Intents | 호출 가능한 동작을 시스템에 등록한다 | 새 Siri는 당신을 보지 않는다. 옛 문구는 구하지 못한다 |
| AI Agent | session에서 다단계 도구를 부른다 | 상태를 채팅 로그에서 추측하고, 다음 홉이 잘못된 객체를 묶는다 |
| JSON Schema | 아무것도 하지 않는다. 자일 뿐이다 | 자가 Swift 매크로에만 있으면 클라우드와 CI는 재지 못한다 |
Lookup이 성공한 뒤에도 자동화 상태는 객체여야 한다. 「찾았다」는 문장이 아니다:
{
"automation": "refund_if_paid",
"trigger": "siri",
"state": {
"order_id": "A-1042",
"status": "paid",
"amount": 99.00
},
"next": {
"intent": "CreateRefund",
"allowed": true
}
}
allowed는 호스트가 Schema와 업무 규칙으로 계산해야 한다. 모델은 「환불을 제안한다」고 말할 수 있다. 스스로 allowed를 true로 쓰면 안 된다.
자동화 실행: Shortcuts, Spotlight, 앱 간
iOS 27의 자동화는 다른 API가 아니다. 같은 Intent 목록 위의 다른 입구다.
- Shortcuts는 시각적 플래너다. 각 타일은 여전히 Intent이고, 넘기는 것은 여전히 파라미터 객체다.
- Spotlight 의미 인덱스는 엔티티를 반환한다. 웹 요약이 아니다. 「지난주 그 주문」은
order_id로 해석되어야 한다. - 앱 간 연결은 가능하지만, 각 쪽이 자신의
perform()을 검증한다. 상대의 산문을 다음 파라미터로 넣지 마라. - 파괴적 동작은 확인한다. 환불, 삭제, 외부 발신은 확인 정책을 선언한다. 결과는 구조화해서 돌려준다. 「OK」만으로는 부족하다.
같은 LookupOrder를 입으로 말하고, 단축어 캔버스에서 누르고, Agent 도구로도 쓸 수 있다. Schema는 하나만 유지한다.
자동화가 실패하면 먼저 객체를 본다. 빠진 required, 목록에 없는 enum, 만료된 엔티티. 호출어를 고치는 일부터 시작하지 마라.
2026년에 어떻게 구현할까
- 저장소에
schemas/intents/와schemas/state/를 두고, 안정적인$id와 버전을 붙인다. - JSON Schema를 먼저 쓰고, 그다음
AppIntent/@Generable를 쓴다. 타입은 투영이지 소스가 아니다. - 부작용(조회, 환불, 발신)은 Intent를 통한다. 추출, 분류, handoff는 Guided Generation을 통한다.
- 새 객체는 기본으로
additionalProperties: false와 명시적enum. 확장하려면 별도의metadata를 더한다. - 환불, 삭제, 외부 발신은 확인을 선언한다. 불법 파라미터를 App Intents Testing에 넣는다. 행복한 경로만 시험하지 마라.
- 비밀과 사용자 필드는 브라우저에서만 본다. 포맷, JSON Diff, 업로드 없음.
디렉터리는 얇아도 된다. 중요한 것은 데모보다 파일이다. Siri의 말투는 바뀐다. 구경을 먼저 안정시킨다.
흔한 실수
- Siri AI를 ChatGPT로 취급한다. Intent를 전달한다. 부작용을 대신 실행하지 않고, 파라미터 적법성도 보장하지 않는다.
- 호출어에만 의존하고 App Intents를 등록하지 않는다. 새 Siri는 당신을 보지 않는다.
- Siri가 채웠으니 검증하지 않는다. 빠진 필드, 잘못된 enum, 만료된 엔티티는 여전히
perform()에 도달한다. - Swift 타입만 쓰고 JSON 소스를 남기지 않는다. 클라우드 API, 평가, 다른 언어 클라이언트가 곧 갈라진다.
- 넓은
type: object로 설계를 피한다. 열린 객체는 게이트가 아니다. 버전을 쓰거나 명시적metadata를 더한다.
FAQ
App Intents를 쓰지 않으면 iOS 27 Siri가 내 앱을 호출할 수 있는가?
새 Siri는 할 수 없다. SiriKit은 마이그레이션 창에 있지만, 자연어 디스패치, 화면 엔티티, 다단계 Agent는 App Intents만 본다. 호출되려면 동작과 파라미터를 먼저 등록한다.
Siri가 이미 파라미터를 채웠다. 그래도 검증해야 하는가?
해야 한다. Siri는 디스패처다. 빠진 필드, 잘못된 enum, 만료된 엔티티는 당신의 perform()에 도달할 수 있다. Intent 선언을 조이고, 실행 전에 같은 Schema로 한 번 더 본다.
Shortcuts와 Siri는 두 개의 API인가?
아니다. 같은 Intent 목록을 읽는다. 차이는 입구다. 목소리, 단축어 캔버스, 또는 Agent 루프. 객체 모양은 같아야 한다.
온디바이스 Agent가 데이터베이스를 직접 바꿀 수 있는가?
없다. 모델은 이름과 인자 제안만 할 수 있다. 상태 변경, 환불, 발신은 호스트의 perform()과 당신의 확인 정책을 거쳐야 한다.
이 JSON을 로컬에서 어떻게 보는가?
먼저 포맷해서 구조를 보고, Schema에서 빠진 required나 잘못된 enum을 찾은 뒤, 이전에 통과한 객체와 Diff한다. JSONSort는 브라우저 로컬에서 하며 데이터를 업로드하지 않는다. 주문이나 주소록을 공개 사이트에 붙이지 마라.
결론
iOS 27에서 Siri AI가 「앱을 호출한다」는 채팅 화면을 여는 일이 아니다. 한 문장을 적법한 Intent 파라미터로 만들고, 호스트가 실행하게 하며, 필요하면 다단계 Agent 루프에 들어가는 일이다.
App Intents는 입구, Agent는 루프, JSON Schema는 실행 전 게이트다. 먼저 schemas/intents/lookup-order.json을 저장소에 넣는다. 그다음 어떤 말투를 데모할지 정한다.
더 읽기
- iPhone 18 AI는 얼마나 강한가 Apple Intelligence, Siri AI, 온디바이스 Agent
- AI Agent란 무엇인가? Tool Calling과 JSON 런타임, 도구 호출, JSON 계약
- AI가 JSON Schema가 필요한 이유 Structured Output, Function Calling, 계약
- AI Agent와 JSON Schema 워크플로 Tool Calling에서 구조화 게이트로
- JSONSort 로컬 도구함 포맷, 검증, Diff
- 모든 글 JSON과 AI 개발 메모
변경 기록: 최초 게시