{"$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/transcript.schema.json", "id": "wwdc2026-319", "language": "eng", "source": "https://developer.apple.com/videos/play/wwdc2026/319", "wordCount": 1527, "segments": [{"start": 7.0, "text": "Hi, I'm Louis."}, {"start": 8.0, "text": "In this video, I'll show you how you can access a powerful new server LLM"}, {"start": 12.0, "text": "in your apps, using Private Cloud Compute."}, {"start": 16.0, "text": "Last year, we gave you access to a powerful on-device LLM"}, {"start": 20.0, "text": "with the new Foundation Models framework."}, {"start": 22.0, "text": "And this year, we've made the on-device LLM even better."}, {"start": 27.0, "text": "It now has support for image input,"}, {"start": 29.0, "text": "it's better at instruction following"}, {"start": 31.0, "text": "and calling your custom tools."}, {"start": 33.0, "text": "But we know there are more complex use cases that require"}, {"start": 36.0, "text": "an even more powerful model."}, {"start": 39.0, "text": "So this year we're also giving you access to a new server model"}, {"start": 44.0, "text": "running on Private Cloud Compute."}, {"start": 47.0, "text": "With this model, you can build complex AI features in your apps."}, {"start": 52.0, "text": "Like assistants that reason over large user input"}, {"start": 56.0, "text": "or features that rely on making lots of tool calls,"}, {"start": 59.0, "text": "with large outputs,"}, {"start": 64.0, "text": "And you can even call Private Cloud Compute from watchOS."}, {"start": 71.0, "text": "In this video, we'll go over what Private Cloud Compute is."}, {"start": 74.0, "text": "I'll show you how you can access it from your apps"}, {"start": 77.0, "text": "with the Foundation Models framework,"}, {"start": 79.0, "text": "and how to handle usage limits."}, {"start": 83.0, "text": "Private Cloud Compute powers our system features,"}, {"start": 86.0, "text": "to send complex tasks to Apple's servers."}, {"start": 89.0, "text": "And you now get access to this in your apps as well."}, {"start": 93.0, "text": "That means you can access a powerful server LLM,"}, {"start": 96.0, "text": "without compromising on privacy."}, {"start": 100.0, "text": "Private Cloud Compute is designed with end-to-end privacy in mind,"}, {"start": 104.0, "text": "ensuring that user data is never stored."}, {"start": 108.0, "text": "The data is only used for requests."}, {"start": 111.0, "text": "And all of this has been independently verified by researchers."}, {"start": 115.0, "text": "But it gets even better."}, {"start": 117.0, "text": "Private Cloud Compute is integrated in the OS, together with iCloud."}, {"start": 122.0, "text": "So you don't have to worry about authentication or API keys,"}, {"start": 126.0, "text": "like you typically do with server models."}, {"start": 129.0, "text": "Your users just need a device that supports Apple Intelligence."}, {"start": 134.0, "text": "With no account setup, no authentication and no API keys,"}, {"start": 138.0, "text": "this is really the easiest server LLM you'll ever use."}, {"start": 143.0, "text": "And even better, there are no token costs to you, the developer."}, {"start": 148.0, "text": "Each user gets a daily limit."}, {"start": 151.0, "text": "And users can upgrade to iCloud+ to get higher limits."}, {"start": 155.0, "text": "This model is available for apps with less than 2M downloads."}, {"start": 160.0, "text": "And you can apply on the developer website today."}, {"start": 163.0, "text": "So let's take a look at how you can integrate this in your apps,"}, {"start": 166.0, "text": "with the Foundation Models framework."}, {"start": 169.0, "text": "If you already have an app using Foundation Models,"}, {"start": 172.0, "text": "you know that it takes just 3 lines of code to prompt the on-device LLM."}, {"start": 177.0, "text": "You create a session and then ask it to respond to your prompt."}, {"start": 182.0, "text": "And now by changing just 1 line of code,"}, {"start": 185.0, "text": "you can switch to the new server model on PCC."}, {"start": 189.0, "text": "With just that line, you're now talking to a much larger model,"}, {"start": 193.0, "text": "with larger context and more complex reasoning capabilities."}, {"start": 198.0, "text": "The Foundation Models framework offers a unified Swift API,"}, {"start": 201.0, "text": "regardless of which model you're talking to."}, {"start": 205.0, "text": "Getting structured output with Generable,"}, {"start": 208.0, "text": "or calling Tools, works just the same with the PCC model,"}, {"start": 213.0, "text": "as it does with the on-device model."}, {"start": 216.0, "text": "This easily lets you switch between models,"}, {"start": 219.0, "text": "without having to rewrite your code."}, {"start": 222.0, "text": "Keep in mind,"}, {"start": 223.0, "text": "just like with the on-device model,"}, {"start": 226.0, "text": "PCC is only available on Apple Intelligence devices."}, {"start": 230.0, "text": "It's important to check the availability API,"}, {"start": 233.0, "text": "and gracefully handle when Apple Intelligence"}, {"start": 236.0, "text": "is not available on a user's device."}, {"start": 240.0, "text": "When writing a feature using Foundation Models,"}, {"start": 242.0, "text": "deciding which model to use is an important decision."}, {"start": 246.0, "text": "So let's take a look at the differences"}, {"start": 248.0, "text": "between the on-device System model and the PCC model."}, {"start": 253.0, "text": "They both offer privacy."}, {"start": 255.0, "text": "But the on-device model works offline, while PCC requires an internet connection."}, {"start": 261.0, "text": "The on-device model has no request limits,"}, {"start": 265.0, "text": "while PCC offers a daily limit per user."}, {"start": 268.0, "text": "Context size is another important factor for some features."}, {"start": 272.0, "text": "The on-device model offers 4k, and with PCC you get 32K."}, {"start": 279.0, "text": "And the PCC model supports reasoning."}, {"start": 283.0, "text": "But what is reasoning?"}, {"start": 286.0, "text": "When an LLM responds to your prompt,"}, {"start": 289.0, "text": "it typically just reads the prompt and generates a response."}, {"start": 294.0, "text": "With reasoning, the model thinks before it generates the response."}, {"start": 299.0, "text": "This literally happens by letting the model generate extra text,"}, {"start": 302.0, "text": "in a separate segment of the transcript."}, {"start": 306.0, "text": "The PCC model offers 3 levels of reasoning."}, {"start": 310.0, "text": "Light lets the model gather some extra context."}, {"start": 314.0, "text": "Moderate lets the model reason a little deeper."}, {"start": 317.0, "text": "And with Deep, the text for the reasoning segment"}, {"start": 320.0, "text": "may be even longer than the actual response."}, {"start": 326.0, "text": "You can set the reasoning level when calling respond on your session."}, {"start": 334.0, "text": "The transcript of your session includes the reasoning segment."}, {"start": 338.0, "text": "You can observe the transcript to show progress,"}, {"start": 342.0, "text": "which is especially useful with the Deep reasoning level,"}, {"start": 345.0, "text": "which may take some time."}, {"start": 348.0, "text": "But keep in mind,"}, {"start": 349.0, "text": "reasoning is extra text that the model generates."}, {"start": 352.0, "text": "So it uses tokens."}, {"start": 354.0, "text": "This counts towards your context size limit."}, {"start": 357.0, "text": "Speaking of context size,"}, {"start": 359.0, "text": "we also added a convenient API"}, {"start": 362.0, "text": "to let you programmatically get the context size for a model."}, {"start": 366.0, "text": "Just access the contextSize property"}, {"start": 369.0, "text": "on either SystemLanguageModel"}, {"start": 371.0, "text": "or PrivateCloudComputeLanguageModel."}, {"start": 374.0, "text": "When deciding between the on-device and PCC model,"}, {"start": 378.0, "text": "or deciding the reasoning level to use,"}, {"start": 380.0, "text": "it's good to make that decision based on data,"}, {"start": 383.0, "text": "not just vibes."}, {"start": 385.0, "text": "Evaluating let's you understand the quality of your specific feature."}, {"start": 389.0, "text": "You may be surprised how well the on-device model performs"}, {"start": 392.0, "text": "at certain tasks,"}, {"start": 393.0, "text": "especially with the updated model this year."}, {"start": 397.0, "text": "But the only way to know is by evaluating."}, {"start": 401.0, "text": "That's why we created the brand new Evaluations framework."}, {"start": 405.0, "text": "It's a new Swift framework that helps you evaluate"}, {"start": 408.0, "text": "your Foundation Models features."}, {"start": 410.0, "text": "It's integrated right in Xcode, and it's easy to get started."}, {"start": 414.0, "text": "You can check out \"Meet the Evaluations framework\" to learn more."}, {"start": 419.0, "text": "And you can even use the on-device and server model together!"}, {"start": 423.0, "text": "Check out \"Build agentic app experiences with Foundation Models\""}, {"start": 427.0, "text": "to learn more about that."}, {"start": 429.0, "text": "When using the PCC model in your app,"}, {"start": 431.0, "text": "it's important to handle usage limits well."}, {"start": 434.0, "text": "Requests are counted with your user's iCloud account."}, {"start": 438.0, "text": "And you can optimize your app for the case where a user hits a limit."}, {"start": 443.0, "text": "So, let's take a look at how to do that."}, {"start": 446.0, "text": "Here I have an app that summarizes an article using the PCC model."}, {"start": 451.0, "text": "I can select a markdown file,"}, {"start": 453.0, "text": "and we take the text and images,"}, {"start": 455.0, "text": "feed that into a LanguageModelSession, and generate a summary."}, {"start": 460.0, "text": "This works great with the large context size that PCC offers."}, {"start": 466.0, "text": "But when a user hits a limit, the request throws an error."}, {"start": 470.0, "text": "If that error is just shown in the UI,"}, {"start": 473.0, "text": "that's not a great user experience,"}, {"start": 475.0, "text": "because it's not very actionable."}, {"start": 478.0, "text": "To handle this better,"}, {"start": 479.0, "text": "you can check for isLimitReached on the quotaUsage of the model."}, {"start": 484.0, "text": "And handle that with custom UI in your app."}, {"start": 487.0, "text": "Here I'm using a label to go under my button."}, {"start": 493.0, "text": "And when the user's limit is exceeded,"}, {"start": 495.0, "text": "you can show a button to let the user manage their limit."}, {"start": 499.0, "text": "For example,"}, {"start": 500.0, "text": "a user could upgrade their account to get a higher limit,"}, {"start": 503.0, "text": "which would let them make more requests."}, {"start": 507.0, "text": "You should integrate this with your existing UI."}, {"start": 510.0, "text": "Avoid showing an alert for the usage limit."}, {"start": 513.0, "text": "Because this UI should persist, and not be dismissed."}, {"start": 517.0, "text": "Instead, you can update the state of your UI,"}, {"start": 520.0, "text": "like disabling the button that makes a request."}, {"start": 523.0, "text": "And under that button I'm showing a subtle label,"}, {"start": 526.0, "text": "with the button for letting the user get a higher limit, if they want."}, {"start": 531.0, "text": "You can also detect the case where a user is approaching their limit."}, {"start": 536.0, "text": "This can be good to indicate to your users that they are close to their daily limit,"}, {"start": 540.0, "text": "so they can make an informed decision for which requests they want to make."}, {"start": 546.0, "text": "In Xcode, we have a convenient debug option"}, {"start": 549.0, "text": "to simulate the usage limit status."}, {"start": 552.0, "text": "In your scheme,"}, {"start": 553.0, "text": "select Debug"}, {"start": 555.0, "text": "and then Options."}, {"start": 558.0, "text": "Here we have the Simulate Apple Foundation Models Availability option."}, {"start": 563.0, "text": "We can select Quota Usage Limit Reached,"}, {"start": 566.0, "text": "to simulate the case we just handled in our UI."}, {"start": 570.0, "text": "And we can also select Nearing Usage Limit,"}, {"start": 573.0, "text": "to simulate the case where the user is close to reaching their daily limit."}, {"start": 579.0, "text": "We already handled the isLimitReached case"}, {"start": 582.0, "text": "in the code before."}, {"start": 584.0, "text": "We can now also test the belowLimit case."}, {"start": 588.0, "text": "Just like with isLimitReached,"}, {"start": 590.0, "text": "we can show a simple label."}, {"start": 593.0, "text": "In the app, this now shows a label under the button to make a request."}, {"start": 598.0, "text": "Again, this contains the actionable button."}, {"start": 601.0, "text": "Now the user can control their limits, even when they're not yet at the maximum."}, {"start": 606.0, "text": "And all this took just a few lines of code."}, {"start": 609.0, "text": "So that was a quick overview of integrating"}, {"start": 611.0, "text": "Private Cloud Compute in your apps."}, {"start": 615.0, "text": "If you would like to use this new server model in your app,"}, {"start": 618.0, "text": "you can apply on the Developer website today."}, {"start": 621.0, "text": "We have a ton of other content"}, {"start": 623.0, "text": "to tell you all about what's new with Foundation Models and related frameworks."}, {"start": 628.0, "text": "You can start with \"What's new in the Foundation Models framework\","}, {"start": 631.0, "text": "for a great overview."}, {"start": 632.0, "text": "And to better understand what happens with the models at runtime,"}, {"start": 636.0, "text": "you can check out \"Debug and profile agentic app experiences with Instruments\"."}, {"start": 642.0, "text": "Thanks for watching!"}, {"start": 644.0, "text": "Where is that book? I need to bring it out to the library."}, {"start": 649.0, "text": "No, really, where is that book?"}]}