{"$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/transcript.schema.json", "id": "wwdc2026-242", "language": "eng", "source": "https://developer.apple.com/videos/play/wwdc2026/242", "wordCount": 2984, "segments": [{"start": 7.0, "text": "Hello everyone!"}, {"start": 8.0, "text": "And thank you for joining us!"}, {"start": 10.0, "text": "My name is Erik."}, {"start": 11.0, "text": "And I'm Oliver."}, {"start": 12.0, "text": "Today, we're going to dig into a new set of APIs that open up whole new possibilities"}, {"start": 16.0, "text": "for your apps;"}, {"start": 18.0, "text": "Dynamic profiles!"}, {"start": 19.0, "text": "But before we dive into the code, we want to lay the groundwork by identifying"}, {"start": 24.0, "text": "the problems these APIs solve, and our philosophy behind their design."}, {"start": 29.0, "text": "The first challenge these APIs solve is context management."}, {"start": 33.0, "text": "In long running sessions, dynamic profiles let you trim or summarize the transcript"}, {"start": 38.0, "text": "to keep it within the model's context window."}, {"start": 40.0, "text": "The second problem these APIs solve is establishing boundaries."}, {"start": 45.0, "text": "When using multiple models, you should design around capability and cost considerations."}, {"start": 50.0, "text": "Dynamic profiles give you that option."}, {"start": 53.0, "text": "This field is changing week-to-week."}, {"start": 56.0, "text": "The primitives that we're introducing are designed to be flexible,"}, {"start": 60.0, "text": "ensuring it's possible to build today's abstractions, and tomorrow's."}, {"start": 64.0, "text": "Exactly!"}, {"start": 65.0, "text": "Dynamic profiles enable context engineering, defining model boundaries,"}, {"start": 70.0, "text": "and can be scaffolded into just about any architecture."}, {"start": 73.0, "text": "And it's in that spirit today that we're announcing a new package;"}, {"start": 77.0, "text": "Foundation Models framework utilities."}, {"start": 80.0, "text": "Utilities is an open source Swift package"}, {"start": 83.0, "text": "that houses components helpful for building agentic experiences."}, {"start": 87.0, "text": "It will be updated in between OS releases and give you access to emerging"}, {"start": 92.0, "text": "or experimental patterns, all backed by dynamic profiles."}, {"start": 96.0, "text": "So now that we've set the stage, let's jump into our agenda."}, {"start": 100.0, "text": "In the first half of this video,"}, {"start": 101.0, "text": "Oliver is going to teach you about the mechanics of dynamic profiles."}, {"start": 106.0, "text": "In the second half, I'll rejoin to cover some advanced topics"}, {"start": 109.0, "text": "related to orchestration patterns."}, {"start": 111.0, "text": "Finally, we'll wrap up with a foray into performance and accuracy considerations."}, {"start": 117.0, "text": "So with that, it's over to you Oliver!"}, {"start": 119.0, "text": "Thanks Erik."}, {"start": 121.0, "text": "With the introduction of the LanguageModel protocol"}, {"start": 123.0, "text": "and PrivateCloudComputeLanguageModel,"}, {"start": 125.0, "text": "you now have more models than ever to choose from."}, {"start": 128.0, "text": "DynamicProfile is a new API that gives you the ability to switch models"}, {"start": 133.0, "text": "within your LanguageModelSession,"}, {"start": 135.0, "text": "providing you with the flexibility to select the best configuration"}, {"start": 139.0, "text": "for the task at hand."}, {"start": 141.0, "text": "DynamicProfile is the foundation on which you can build many useful abstractions,"}, {"start": 146.0, "text": "such as agents or skills."}, {"start": 148.0, "text": "Today, I'll give you a tour of the API starting with leveraging multiple models,"}, {"start": 153.0, "text": "before diving into transcript considerations"}, {"start": 156.0, "text": "and finishing with session lifecycle events."}, {"start": 159.0, "text": "Let's start by looking at an example."}, {"start": 163.0, "text": "I'm working on a craft app called Origami"}, {"start": 165.0, "text": "which can produce both origami and crochet tutorials."}, {"start": 170.0, "text": "Here, the user will upload images and our app will help them"}, {"start": 173.0, "text": "brainstorm ideas using the image as inspiration."}, {"start": 178.0, "text": "The user can provide feedback on the shortlist of ideas"}, {"start": 181.0, "text": "before a tutorial is generated for the selected concept."}, {"start": 185.0, "text": "While the user works through the tutorial, they can upload in-progress photos"}, {"start": 189.0, "text": "and get advice on their technique."}, {"start": 192.0, "text": "Each stage in the app requires shared context but individually,"}, {"start": 197.0, "text": "they have a unique set of priorities."}, {"start": 200.0, "text": "They may benefit from a diverse set of models,"}, {"start": 203.0, "text": "with different instructions and generation options."}, {"start": 207.0, "text": "These configurations are agents - they act on your app's behalf,"}, {"start": 211.0, "text": "and are configured with a particular goal and set of capabilities in mind."}, {"start": 216.0, "text": "DynamicProfile allows you to declare individual Profiles,"}, {"start": 219.0, "text": "which represent a configuration state or agent in your LanguageModelSession."}, {"start": 224.0, "text": "A Profile is made up of instructions, tools, and modifiers"}, {"start": 228.0, "text": "for configuring things like the model, temperature, samplingMode and more."}, {"start": 234.0, "text": "So let's start by declaring a DynamicProfile for our craft experience."}, {"start": 239.0, "text": "Here, we have an Observable class called CraftOrchestrator"}, {"start": 243.0, "text": "that will track the different phases of the app."}, {"start": 247.0, "text": "We'll focus on the brainstorming phase first,"}, {"start": 249.0, "text": "which is used for presenting different craft project ideas to the user."}, {"start": 255.0, "text": "Here, our new profile has some instructions"}, {"start": 258.0, "text": "explaining its goal"}, {"start": 260.0, "text": "and a tool for generating titles."}, {"start": 263.0, "text": "Because origami is a complicated craft,"}, {"start": 266.0, "text": "let's also include some additional instructions and tools"}, {"start": 269.0, "text": "but only when the user is working on an origami project."}, {"start": 274.0, "text": "OrigamiExpert makes use of another new type called DynamicInstructions."}, {"start": 280.0, "text": "DynamicInstructions enables grouping of relevant tools and instructions together"}, {"start": 284.0, "text": "into a single component that can be reused throughout your codebase."}, {"start": 289.0, "text": "OrigamiExpert contains knowledge and tools"}, {"start": 293.0, "text": "that can be reused every time we're prompting a model about origami."}, {"start": 298.0, "text": "DynamicInstructions are also composable"}, {"start": 301.0, "text": "so nesting OrigamiExpert inside another DynamicInstructions body"}, {"start": 306.0, "text": "will concatenate the instructions and tools together."}, {"start": 310.0, "text": "Here, we've created BrainstormFacilitator to hold our profile's instructions."}, {"start": 315.0, "text": "Now we can clean up our brainstorming profile using the new declaration."}, {"start": 320.0, "text": "Since brainstorming requires both a broad knowledge of crafts and creative thinking,"}, {"start": 326.0, "text": "this profile will use PrivateCloudComputeLanguageModel,"}, {"start": 329.0, "text": "which is a new model available in Foundation Models."}, {"start": 333.0, "text": "Be sure to check out the talk from Louis"}, {"start": 335.0, "text": "on PCC in Foundation Models to learn more about what this model"}, {"start": 339.0, "text": "has to offer."}, {"start": 341.0, "text": "We'll also set the temperature to 1,"}, {"start": 343.0, "text": "to allow the model to produce more creative responses."}, {"start": 347.0, "text": "We've just defined our first agent using DynamicProfiles."}, {"start": 353.0, "text": "Let's move on to the next mode in our profile: planning."}, {"start": 357.0, "text": "The \"planning\" profile is responsible for creating directions"}, {"start": 361.0, "text": "for an agreed upon craft project."}, {"start": 363.0, "text": "Again, we'll use PCCLanguageModel since this requires in-depth knowledge of crafts."}, {"start": 370.0, "text": "We'll also configure reasoningLevel,"}, {"start": 372.0, "text": "which is a capability available to most server models."}, {"start": 375.0, "text": "This controls the model's capacity to think through the problem"}, {"start": 378.0, "text": "before responding."}, {"start": 380.0, "text": "Since generating a tutorial is complex, we'll set it to deep."}, {"start": 385.0, "text": "Lastly, the \"reviewing\" phase provides advice and guidance"}, {"start": 389.0, "text": "as the user works through the tutorial."}, {"start": 392.0, "text": "To save on unnecessary server calls, this makes use of SystemLanguageModel."}, {"start": 398.0, "text": "And just like that, we've finished defining our crafting DynamicProfile."}, {"start": 403.0, "text": "To make use of DynamicProfile in your session,"}, {"start": 406.0, "text": "it's as simple as using the new LanguageModelSession initializer."}, {"start": 411.0, "text": "Note that the body of a DynamicProfile is re-evaluated"}, {"start": 415.0, "text": "each time the model is prompted,"}, {"start": 417.0, "text": "so as the app moves between each mode,"}, {"start": 420.0, "text": "the persona of the LanguageModelSession changes."}, {"start": 424.0, "text": "You can think of this as swapping hats, or switching agents."}, {"start": 427.0, "text": "You can move from brainstorming"}, {"start": 429.0, "text": "to planning,"}, {"start": 431.0, "text": "to reviewing."}, {"start": 432.0, "text": "All by changing the mode."}, {"start": 434.0, "text": "You've now seen how you can route between different models using DynamicProfile."}, {"start": 439.0, "text": "But it's important to consider that each model may have different context size limits."}, {"start": 445.0, "text": "Our craft example switches between PCCLanguageModel and SystemLanguageModel."}, {"start": 451.0, "text": "When moving between models,"}, {"start": 452.0, "text": "you may need to trim unnecessary entries to stay within the context size."}, {"start": 457.0, "text": "But that's not the only reason for adjusting the model's context."}, {"start": 460.0, "text": "You can also improve the model's focus by removing irrelevant entries,"}, {"start": 464.0, "text": "or redact private information from existing entries"}, {"start": 468.0, "text": "when moving to a less private model."}, {"start": 471.0, "text": "The transcript is LanguageModelSession's representation of the model's context."}, {"start": 476.0, "text": "DynamicInstructions offers one way to modify the transcript."}, {"start": 480.0, "text": "More specifically, it allows modifying the instructions entry."}, {"start": 485.0, "text": "For updating the remaining entries,"}, {"start": 487.0, "text": "we'll use a window into the transcript called \"history\"."}, {"start": 492.0, "text": "Dropping tool calls is one easy way to trim history."}, {"start": 496.0, "text": "Let's take a look at how you'd implement this."}, {"start": 500.0, "text": "historyTransform can be applied to a profile"}, {"start": 503.0, "text": "to transform the history prior to prompting the model."}, {"start": 507.0, "text": "This is the opportune time to filter out entries"}, {"start": 510.0, "text": "that may not be necessary for the request."}, {"start": 513.0, "text": "Applying a transformation on our \"reviewing\" profile"}, {"start": 516.0, "text": "helps keep the transcript within the on device model's context size."}, {"start": 521.0, "text": "Transforms don't permanently mutate the session's transcript."}, {"start": 525.0, "text": "Instead, they're local transformations applied prior to prompting the model."}, {"start": 529.0, "text": "This means you don't need to worry about losing context"}, {"start": 532.0, "text": "that may become relevant at a later point."}, {"start": 535.0, "text": "Our historyTransform has a lot going on."}, {"start": 538.0, "text": "Let me show you how we can use custom modifiers"}, {"start": 541.0, "text": "to hide the complexity of our transform."}, {"start": 544.0, "text": "First, we'll declare a new type"}, {"start": 546.0, "text": "that conforms to DynamicProfileModifier"}, {"start": 549.0, "text": "and apply our historyTransform."}, {"start": 552.0, "text": "We can then make it available for reuse by implementing an extension"}, {"start": 556.0, "text": "on DynamicProfile."}, {"start": 558.0, "text": "Any new Profiles that would benefit from reducing context"}, {"start": 562.0, "text": "can now utilize the new modifier."}, {"start": 565.0, "text": "We've made a number of useful modifiers available in the new Foundation Models"}, {"start": 569.0, "text": "framework utilities package."}, {"start": 571.0, "text": "We encourage you to take a look."}, {"start": 574.0, "text": "Custom modifiers are a great way to build"}, {"start": 577.0, "text": "reusable configuration for your declarations."}, {"start": 580.0, "text": "But transforms aren't the only way that you can influence the transcript."}, {"start": 584.0, "text": "Let's take a look at another more stateful approach."}, {"start": 589.0, "text": "At certain points in the session, you may need to summarize earlier entries"}, {"start": 593.0, "text": "from the existing transcript to reclaim context."}, {"start": 597.0, "text": "Doing this after each model's response"}, {"start": 600.0, "text": "provides a clear boundary in the session's lifecycle."}, {"start": 604.0, "text": "Let's take a look at how we can perform our summarize operation"}, {"start": 607.0, "text": "after each response using a new set of modifiers."}, {"start": 611.0, "text": "Lifecycle modifiers provide access to your profile's progress"}, {"start": 616.0, "text": "by giving you the opportunity to run imperative code"}, {"start": 619.0, "text": "directly in your profile declaration."}, {"start": 622.0, "text": "This can be useful for updating state"}, {"start": 624.0, "text": "external to your session, like reflecting progress in UI."}, {"start": 628.0, "text": "But it's also useful for internal state updates,"}, {"start": 631.0, "text": "like changing the mode in our craft profile or modifying the session's history."}, {"start": 637.0, "text": "Let's use the onResponse modifier to mutate the history"}, {"start": 641.0, "text": "at the response boundary that I mentioned earlier."}, {"start": 644.0, "text": "You'll notice this is also making use of another new concept: session properties."}, {"start": 649.0, "text": "Session properties allow you to define state"}, {"start": 652.0, "text": "that's accessible from any Tool or Profile."}, {"start": 655.0, "text": "The history property that we just used is a built-in property"}, {"start": 659.0, "text": "provided by the framework."}, {"start": 661.0, "text": "It captures the session's history and can be used as an alternative"}, {"start": 664.0, "text": "to historyTransform for updating the transcript."}, {"start": 668.0, "text": "Keep in mind that the history property is lossy"}, {"start": 672.0, "text": "and its changes will be reflected across all profiles in the session."}, {"start": 676.0, "text": "For lossless transformations targeted to specific profiles,"}, {"start": 681.0, "text": "you should prefer historyTransform."}, {"start": 683.0, "text": "In addition to history, you can also create your own session properties."}, {"start": 688.0, "text": "Let's create a new property to store our conversation summary when onResponse is called."}, {"start": 694.0, "text": "You can declare properties using the @SessionPropertyEntry macro"}, {"start": 698.0, "text": "within an extension on SessionPropertyValues."}, {"start": 701.0, "text": "All session properties are mutable and must have an initial value."}, {"start": 706.0, "text": "Here, we've declared our summary as an optional string."}, {"start": 709.0, "text": "Each Profile can now read the value of the summary"}, {"start": 712.0, "text": "by accessing the session property that we just declared."}, {"start": 716.0, "text": "We'll include the summary in our profile's instructions to ensure they have the context"}, {"start": 721.0, "text": "on the transcript entries that were dropped."}, {"start": 725.0, "text": "Any profile can write to the property and changes will be visible across the session."}, {"start": 732.0, "text": "Now let me produce a conversation summary for you."}, {"start": 735.0, "text": "Use lifecycle modifiers to run code at specific points in the session."}, {"start": 740.0, "text": "Use the history property to update the session's history for all profiles."}, {"start": 745.0, "text": "And use custom session properties"}, {"start": 747.0, "text": "for storing state that's shared by all session components."}, {"start": 751.0, "text": "And with that, I'll hand it back to Erik"}, {"start": 753.0, "text": "to teach you about agent orchestration."}, {"start": 756.0, "text": "Thanks Oliver!"}, {"start": 758.0, "text": "Hopefully, you're starting to develop an intuition for how profiles can be used"}, {"start": 761.0, "text": "to build things like agents."}, {"start": 763.0, "text": "Let's take a look at two common patterns for orchestrating agentic experiences."}, {"start": 769.0, "text": "We like to refer to these patterns as baton-pass and phone-a-friend."}, {"start": 774.0, "text": "Baton-pass is a collaboration and phone-a-friend is a consultation."}, {"start": 780.0, "text": "Let's look at baton-pass first."}, {"start": 783.0, "text": "In this pattern, there are two or more profiles,"}, {"start": 786.0, "text": "typically each leveraging different models."}, {"start": 790.0, "text": "There also needs to be a variable that controls which profile is active."}, {"start": 796.0, "text": "Finally, we give each profile a tool that allows the model to set that variable."}, {"start": 803.0, "text": "Together, these pieces make up the baton-pass pattern."}, {"start": 808.0, "text": "If we're currently brainstorming and ask how to fold a crane,"}, {"start": 811.0, "text": "the brainstorm profile will call a tool to pass the baton to the tutorial profile."}, {"start": 817.0, "text": "A tool output signals a successful handoff, and the tutorial profile produces"}, {"start": 822.0, "text": "the final answer."}, {"start": 824.0, "text": "The most important attributes of the baton-pass pattern"}, {"start": 828.0, "text": "are that the full transcript history is visible to both profiles,"}, {"start": 832.0, "text": "and that the profile that receives the baton"}, {"start": 835.0, "text": "can carry it across the finish line and provide the final response."}, {"start": 840.0, "text": "Both of those attributes will be in contrast to the next pattern we look at:"}, {"start": 845.0, "text": "phone-a-friend."}, {"start": 848.0, "text": "In the phone-a-friend pattern, you also rely on tool calling."}, {"start": 852.0, "text": "The key difference is that instead of toggling a variable,"}, {"start": 856.0, "text": "the tool spawns a short-lived session."}, {"start": 860.0, "text": "If we ask for a fun project for kids,"}, {"start": 863.0, "text": "the model may reason that it needs a title for the project,"}, {"start": 866.0, "text": "and call its phone-a-friend tool to consult with the title profile."}, {"start": 871.0, "text": "The phone-a-friend tool spawns a new session with an independent transcript"}, {"start": 876.0, "text": "prompts it, and then delivers the response back as tool output."}, {"start": 882.0, "text": "The child session disappears, and the parent session"}, {"start": 885.0, "text": "produces the final response."}, {"start": 887.0, "text": "The most important attributes of the phone-a-friend pattern"}, {"start": 891.0, "text": "are that the transcripts for each profile are isolated,"}, {"start": 894.0, "text": "and that the parent profile is always responsible for giving the final answer."}, {"start": 900.0, "text": "Baton-pass and phone-a-friend are good tools to have in your belt,"}, {"start": 904.0, "text": "but there are other options as well."}, {"start": 907.0, "text": "For example, the Foundation Models framework utilities package"}, {"start": 910.0, "text": "houses a Skills type, which you may be familiar with as a popular pattern"}, {"start": 915.0, "text": "for procedural context loading."}, {"start": 918.0, "text": "So now that you've got a grasp on the many ways tools can be used for orchestration,"}, {"start": 922.0, "text": "we're going to look at a new knob you can use"}, {"start": 924.0, "text": "to exert control over when tool calls happen -"}, {"start": 926.0, "text": "Tool calling mode."}, {"start": 929.0, "text": "Tool calling mode has three options:"}, {"start": 932.0, "text": "allowed, disallowed, and required."}, {"start": 936.0, "text": "The default value is \"allowed\", which is the existing behavior."}, {"start": 940.0, "text": "The model may produce a tool call or it may respond directly."}, {"start": 944.0, "text": "This is the option to use when you just don't know if tools will be necessary or not,"}, {"start": 949.0, "text": "which is the most common case."}, {"start": 952.0, "text": "\"disallowed\" prevents the model from calling tools."}, {"start": 955.0, "text": "This can be helpful if the user navigates into a part of your app"}, {"start": 959.0, "text": "where the session's tools are known to be irrelevant."}, {"start": 963.0, "text": "Finally, \"required\" means that the model can only call tools."}, {"start": 967.0, "text": "And this can be particularly useful in agentic systems that represent"}, {"start": 971.0, "text": "all actions as tool calls."}, {"start": 975.0, "text": "If you're using profiles, you can specify tool calling mode with a modifier."}, {"start": 981.0, "text": "If you're not using a profile, tool calling mode can be set via"}, {"start": 985.0, "text": "GenerationOptions when calling respond(to:)."}, {"start": 989.0, "text": "Here's the most important thing to remember."}, {"start": 993.0, "text": "When tool calling is required, the model is essentially in a while loop -"}, {"start": 997.0, "text": "it is your job to ensure that there is an exit condition of some kind."}, {"start": 1003.0, "text": "One good option is to conditionalize the tool call mode on a variable."}, {"start": 1008.0, "text": "Here, we're requiring tool calls until the model calls the database tool."}, {"start": 1015.0, "text": "A second, more forceful option is to equip your model with a final answer tool"}, {"start": 1020.0, "text": "that throws an error."}, {"start": 1022.0, "text": "Throwing an error aborts the tool calling loop"}, {"start": 1024.0, "text": "and immediately returns control flow to you."}, {"start": 1028.0, "text": "By default, when you throw an error from a tool, or when you cancel a response,"}, {"start": 1032.0, "text": "your session's transcript will roll back to its previous state."}, {"start": 1038.0, "text": "For advanced use cases where you want to allow cancelling part way through a response"}, {"start": 1042.0, "text": "and then resuming again, you need to keep your transcript in state after an error."}, {"start": 1049.0, "text": "We've added new API to enable this."}, {"start": 1052.0, "text": "If you're using profiles, you can now set \"transcriptErrorHandlingPolicy\""}, {"start": 1057.0, "text": "using a modifier."}, {"start": 1059.0, "text": "If you're not using a profile, you can set it directly on your session."}, {"start": 1065.0, "text": "The two options are \".revertTranscript\" and \".preserveTranscript\"."}, {"start": 1070.0, "text": "When using \".preserveTranscript\", the onus is on you to put your transcript back"}, {"start": 1076.0, "text": "into a good state if you intend to continue using your session."}, {"start": 1081.0, "text": "To facilitate that, the \"transcript\" property on session is now mutable."}, {"start": 1087.0, "text": "Remember though, you can only modify the transcript when the session's"}, {"start": 1091.0, "text": "\"isResponding\" property is false."}, {"start": 1094.0, "text": "Attempting to mutate the transcript during a response is a programmer error."}, {"start": 1101.0, "text": "Now that we've taken a look at our new APIs, we need to talk about"}, {"start": 1104.0, "text": "the implications of mutating the transcript on performance and accuracy."}, {"start": 1109.0, "text": "Key-value, or KV caches are an important optimization mechanism"}, {"start": 1113.0, "text": "in large language models"}, {"start": 1115.0, "text": "and they can be invalidated by transcript mutations."}, {"start": 1119.0, "text": "Generally, appending to the transcript preserves the KV cache,"}, {"start": 1123.0, "text": "and minimizes the time-to-firsttoken."}, {"start": 1127.0, "text": "If you rewrite history by removing entries,"}, {"start": 1131.0, "text": "changing the attached tools, or updating the instructions,"}, {"start": 1134.0, "text": "that will typically trigger a cache invalidation, and can increase latency."}, {"start": 1139.0, "text": "Now, we didn't talk about this last year because we intentionally shaped"}, {"start": 1144.0, "text": "LanguageModelsSession APIs to be append only."}, {"start": 1148.0, "text": "By default, they ensured optimal use."}, {"start": 1152.0, "text": "But this year, we're taking the training wheels off, so to say."}, {"start": 1158.0, "text": "It's important to understand that different models have different caching behavior"}, {"start": 1163.0, "text": "and the only way to be certain is by measuring."}, {"start": 1167.0, "text": "The best way to do that is the upgraded Foundation Models Instrument in Xcode."}, {"start": 1173.0, "text": "For more about detecting cache invalidations with Instruments,"}, {"start": 1176.0, "text": "make sure to check out our video on debugging and profiling."}, {"start": 1181.0, "text": "In addition to performance implications, the other thing you have to be careful about"}, {"start": 1185.0, "text": "when rewriting history is accuracy,"}, {"start": 1188.0, "text": "because it's possible to confuse the model."}, {"start": 1191.0, "text": "Let's say I have a session where I asked the model to think of fun"}, {"start": 1195.0, "text": "origami project names."}, {"start": 1198.0, "text": "And then let's say I add a generate title tool to the session,"}, {"start": 1204.0, "text": "and prompt it for more ideas."}, {"start": 1206.0, "text": "What do you expect will happen next?"}, {"start": 1209.0, "text": "If we're lucky, the model will use the tool like we want."}, {"start": 1214.0, "text": "But it's also possible that the model will notice it previously generated titles"}, {"start": 1220.0, "text": "without the tool,"}, {"start": 1222.0, "text": "and may think it's supposed to do that again."}, {"start": 1225.0, "text": "That's not what we want. Our history modification confused the model."}, {"start": 1230.0, "text": "When you start to get into nuanced transcript modifications like this,"}, {"start": 1234.0, "text": "it becomes even more important to use the Evaluations framework to create eval sets"}, {"start": 1239.0, "text": "and quantify the effect of context engineering strategies."}, {"start": 1243.0, "text": "Data driven optimization is the only way to be confident."}, {"start": 1248.0, "text": "I highly recommend watching all of our videos about the evaluations framework."}, {"start": 1253.0, "text": "Alright, that brings us to the end of our section on performance and accuracy."}, {"start": 1258.0, "text": "That was a lot!"}, {"start": 1260.0, "text": "Are you ready to bring it home Oliver?"}, {"start": 1262.0, "text": "You know it."}, {"start": 1263.0, "text": "We've shown you how dynamic profiles allow you to steer model behavior and manage"}, {"start": 1268.0, "text": "your session's transcript."}, {"start": 1269.0, "text": "We talked through patterns like phone-a-friend and baton-pass,"}, {"start": 1273.0, "text": "tool calling mode, manual transcript management, and even KV caches."}, {"start": 1277.0, "text": "And we hope you're as enthusiastic about"}, {"start": 1279.0, "text": "Foundation Models framework utilities as we are!"}, {"start": 1282.0, "text": "Next, try playing around with the sample app."}, {"start": 1285.0, "text": "Or test out PCC together with the revamped Xcode instrument."}, {"start": 1292.0, "text": "Until next time, thanks for watching."}, {"start": 1294.0, "text": "Thank you!"}]}