google-adk 1.6.1__py3-none-any.whl → 1.7.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. google/adk/a2a/converters/event_converter.py +5 -85
  2. google/adk/a2a/executor/a2a_agent_executor.py +45 -16
  3. google/adk/agents/__init__.py +5 -0
  4. google/adk/agents/agent_config.py +46 -0
  5. google/adk/agents/base_agent.py +234 -41
  6. google/adk/agents/callback_context.py +41 -0
  7. google/adk/agents/common_configs.py +79 -0
  8. google/adk/agents/config_agent_utils.py +184 -0
  9. google/adk/agents/config_schemas/AgentConfig.json +544 -0
  10. google/adk/agents/invocation_context.py +5 -1
  11. google/adk/agents/llm_agent.py +190 -9
  12. google/adk/agents/loop_agent.py +29 -0
  13. google/adk/agents/parallel_agent.py +24 -3
  14. google/adk/agents/remote_a2a_agent.py +15 -3
  15. google/adk/agents/sequential_agent.py +22 -1
  16. google/adk/artifacts/gcs_artifact_service.py +24 -2
  17. google/adk/auth/auth_handler.py +3 -3
  18. google/adk/auth/credential_manager.py +23 -23
  19. google/adk/auth/credential_service/base_credential_service.py +6 -6
  20. google/adk/auth/credential_service/in_memory_credential_service.py +10 -8
  21. google/adk/auth/credential_service/session_state_credential_service.py +8 -8
  22. google/adk/auth/exchanger/oauth2_credential_exchanger.py +3 -3
  23. google/adk/auth/oauth2_credential_util.py +2 -2
  24. google/adk/auth/refresher/oauth2_credential_refresher.py +4 -4
  25. google/adk/cli/agent_graph.py +3 -1
  26. google/adk/cli/browser/index.html +1 -1
  27. google/adk/cli/browser/main-SRBSE46V.js +3914 -0
  28. google/adk/cli/browser/polyfills-B6TNHZQ6.js +17 -0
  29. google/adk/cli/fast_api.py +42 -2
  30. google/adk/cli/utils/agent_loader.py +35 -1
  31. google/adk/code_executors/base_code_executor.py +14 -19
  32. google/adk/code_executors/built_in_code_executor.py +4 -1
  33. google/adk/evaluation/base_eval_service.py +46 -2
  34. google/adk/evaluation/evaluation_generator.py +1 -1
  35. google/adk/evaluation/in_memory_eval_sets_manager.py +151 -0
  36. google/adk/evaluation/local_eval_service.py +389 -0
  37. google/adk/evaluation/local_eval_sets_manager.py +23 -8
  38. google/adk/flows/llm_flows/auto_flow.py +6 -11
  39. google/adk/flows/llm_flows/base_llm_flow.py +41 -23
  40. google/adk/flows/llm_flows/contents.py +16 -10
  41. google/adk/flows/llm_flows/functions.py +76 -33
  42. google/adk/memory/in_memory_memory_service.py +20 -14
  43. google/adk/models/anthropic_llm.py +44 -5
  44. google/adk/models/google_llm.py +11 -6
  45. google/adk/models/lite_llm.py +21 -4
  46. google/adk/plugins/__init__.py +17 -0
  47. google/adk/plugins/base_plugin.py +317 -0
  48. google/adk/plugins/plugin_manager.py +265 -0
  49. google/adk/runners.py +122 -18
  50. google/adk/sessions/database_session_service.py +26 -28
  51. google/adk/sessions/vertex_ai_session_service.py +14 -7
  52. google/adk/tools/agent_tool.py +1 -0
  53. google/adk/tools/apihub_tool/apihub_toolset.py +38 -39
  54. google/adk/tools/application_integration_tool/application_integration_toolset.py +35 -37
  55. google/adk/tools/application_integration_tool/integration_connector_tool.py +2 -3
  56. google/adk/tools/base_tool.py +9 -9
  57. google/adk/tools/base_toolset.py +7 -5
  58. google/adk/tools/bigquery/__init__.py +3 -3
  59. google/adk/tools/enterprise_search_tool.py +4 -2
  60. google/adk/tools/google_api_tool/google_api_tool.py +16 -1
  61. google/adk/tools/google_api_tool/google_api_toolset.py +9 -7
  62. google/adk/tools/google_api_tool/google_api_toolsets.py +41 -20
  63. google/adk/tools/google_search_tool.py +4 -2
  64. google/adk/tools/langchain_tool.py +2 -3
  65. google/adk/tools/long_running_tool.py +21 -0
  66. google/adk/tools/mcp_tool/mcp_toolset.py +27 -28
  67. google/adk/tools/openapi_tool/openapi_spec_parser/openapi_toolset.py +8 -8
  68. google/adk/tools/openapi_tool/openapi_spec_parser/rest_api_tool.py +4 -6
  69. google/adk/tools/retrieval/vertex_ai_rag_retrieval.py +3 -2
  70. google/adk/tools/tool_context.py +0 -10
  71. google/adk/tools/url_context_tool.py +4 -2
  72. google/adk/tools/vertex_ai_search_tool.py +4 -2
  73. google/adk/utils/model_name_utils.py +90 -0
  74. google/adk/version.py +1 -1
  75. {google_adk-1.6.1.dist-info → google_adk-1.7.0.dist-info}/METADATA +2 -2
  76. {google_adk-1.6.1.dist-info → google_adk-1.7.0.dist-info}/RECORD +79 -69
  77. google/adk/cli/browser/main-RXDVX3K6.js +0 -3914
  78. google/adk/cli/browser/polyfills-FFHMD2TL.js +0 -17
  79. {google_adk-1.6.1.dist-info → google_adk-1.7.0.dist-info}/WHEEL +0 -0
  80. {google_adk-1.6.1.dist-info → google_adk-1.7.0.dist-info}/entry_points.txt +0 -0
  81. {google_adk-1.6.1.dist-info → google_adk-1.7.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Copyright 2025 Google LLC
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ var ce=globalThis;function te(t){return(ce.__Zone_symbol_prefix||"__zone_symbol__")+t}function ht(){let t=ce.performance;function n(I){t&&t.mark&&t.mark(I)}function a(I,s){t&&t.measure&&t.measure(I,s)}n("Zone");class e{static __symbol__=te;static assertZonePatched(){if(ce.Promise!==S.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")}static get root(){let s=e.current;for(;s.parent;)s=s.parent;return s}static get current(){return b.zone}static get currentTask(){return D}static __load_patch(s,i,r=!1){if(S.hasOwnProperty(s)){let E=ce[te("forceDuplicateZoneCheck")]===!0;if(!r&&E)throw Error("Already loaded patch: "+s)}else if(!ce["__Zone_disable_"+s]){let E="Zone:"+s;n(E),S[s]=i(ce,e,R),a(E,E)}}get parent(){return this._parent}get name(){return this._name}_parent;_name;_properties;_zoneDelegate;constructor(s,i){this._parent=s,this._name=i?i.name||"unnamed":"<root>",this._properties=i&&i.properties||{},this._zoneDelegate=new f(this,this._parent&&this._parent._zoneDelegate,i)}get(s){let i=this.getZoneWith(s);if(i)return i._properties[s]}getZoneWith(s){let i=this;for(;i;){if(i._properties.hasOwnProperty(s))return i;i=i._parent}return null}fork(s){if(!s)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,s)}wrap(s,i){if(typeof s!="function")throw new Error("Expecting function got: "+s);let r=this._zoneDelegate.intercept(this,s,i),E=this;return function(){return E.runGuarded(r,this,arguments,i)}}run(s,i,r,E){b={parent:b,zone:this};try{return this._zoneDelegate.invoke(this,s,i,r,E)}finally{b=b.parent}}runGuarded(s,i=null,r,E){b={parent:b,zone:this};try{try{return this._zoneDelegate.invoke(this,s,i,r,E)}catch(x){if(this._zoneDelegate.handleError(this,x))throw x}}finally{b=b.parent}}runTask(s,i,r){if(s.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(s.zone||J).name+"; Execution: "+this.name+")");let E=s,{type:x,data:{isPeriodic:ee=!1,isRefreshable:M=!1}={}}=s;if(s.state===q&&(x===U||x===k))return;let he=s.state!=A;he&&E._transitionTo(A,d);let _e=D;D=E,b={parent:b,zone:this};try{x==k&&s.data&&!ee&&!M&&(s.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,E,i,r)}catch(Q){if(this._zoneDelegate.handleError(this,Q))throw Q}}finally{let Q=s.state;if(Q!==q&&Q!==X)if(x==U||ee||M&&Q===p)he&&E._transitionTo(d,A,p);else{let Te=E._zoneDelegates;this._updateTaskCount(E,-1),he&&E._transitionTo(q,A,q),M&&(E._zoneDelegates=Te)}b=b.parent,D=_e}}scheduleTask(s){if(s.zone&&s.zone!==this){let r=this;for(;r;){if(r===s.zone)throw Error(`can not reschedule task to ${this.name} which is descendants of the original zone ${s.zone.name}`);r=r.parent}}s._transitionTo(p,q);let i=[];s._zoneDelegates=i,s._zone=this;try{s=this._zoneDelegate.scheduleTask(this,s)}catch(r){throw s._transitionTo(X,p,q),this._zoneDelegate.handleError(this,r),r}return s._zoneDelegates===i&&this._updateTaskCount(s,1),s.state==p&&s._transitionTo(d,p),s}scheduleMicroTask(s,i,r,E){return this.scheduleTask(new g(F,s,i,r,E,void 0))}scheduleMacroTask(s,i,r,E,x){return this.scheduleTask(new g(k,s,i,r,E,x))}scheduleEventTask(s,i,r,E,x){return this.scheduleTask(new g(U,s,i,r,E,x))}cancelTask(s){if(s.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(s.zone||J).name+"; Execution: "+this.name+")");if(!(s.state!==d&&s.state!==A)){s._transitionTo(V,d,A);try{this._zoneDelegate.cancelTask(this,s)}catch(i){throw s._transitionTo(X,V),this._zoneDelegate.handleError(this,i),i}return this._updateTaskCount(s,-1),s._transitionTo(q,V),s.runCount=-1,s}}_updateTaskCount(s,i){let r=s._zoneDelegates;i==-1&&(s._zoneDelegates=null);for(let E=0;E<r.length;E++)r[E]._updateTaskCount(s.type,i)}}let c={name:"",onHasTask:(I,s,i,r)=>I.hasTask(i,r),onScheduleTask:(I,s,i,r)=>I.scheduleTask(i,r),onInvokeTask:(I,s,i,r,E,x)=>I.invokeTask(i,r,E,x),onCancelTask:(I,s,i,r)=>I.cancelTask(i,r)};class f{get zone(){return this._zone}_zone;_taskCounts={microTask:0,macroTask:0,eventTask:0};_parentDelegate;_forkDlgt;_forkZS;_forkCurrZone;_interceptDlgt;_interceptZS;_interceptCurrZone;_invokeDlgt;_invokeZS;_invokeCurrZone;_handleErrorDlgt;_handleErrorZS;_handleErrorCurrZone;_scheduleTaskDlgt;_scheduleTaskZS;_scheduleTaskCurrZone;_invokeTaskDlgt;_invokeTaskZS;_invokeTaskCurrZone;_cancelTaskDlgt;_cancelTaskZS;_cancelTaskCurrZone;_hasTaskDlgt;_hasTaskDlgtOwner;_hasTaskZS;_hasTaskCurrZone;constructor(s,i,r){this._zone=s,this._parentDelegate=i,this._forkZS=r&&(r&&r.onFork?r:i._forkZS),this._forkDlgt=r&&(r.onFork?i:i._forkDlgt),this._forkCurrZone=r&&(r.onFork?this._zone:i._forkCurrZone),this._interceptZS=r&&(r.onIntercept?r:i._interceptZS),this._interceptDlgt=r&&(r.onIntercept?i:i._interceptDlgt),this._interceptCurrZone=r&&(r.onIntercept?this._zone:i._interceptCurrZone),this._invokeZS=r&&(r.onInvoke?r:i._invokeZS),this._invokeDlgt=r&&(r.onInvoke?i:i._invokeDlgt),this._invokeCurrZone=r&&(r.onInvoke?this._zone:i._invokeCurrZone),this._handleErrorZS=r&&(r.onHandleError?r:i._handleErrorZS),this._handleErrorDlgt=r&&(r.onHandleError?i:i._handleErrorDlgt),this._handleErrorCurrZone=r&&(r.onHandleError?this._zone:i._handleErrorCurrZone),this._scheduleTaskZS=r&&(r.onScheduleTask?r:i._scheduleTaskZS),this._scheduleTaskDlgt=r&&(r.onScheduleTask?i:i._scheduleTaskDlgt),this._scheduleTaskCurrZone=r&&(r.onScheduleTask?this._zone:i._scheduleTaskCurrZone),this._invokeTaskZS=r&&(r.onInvokeTask?r:i._invokeTaskZS),this._invokeTaskDlgt=r&&(r.onInvokeTask?i:i._invokeTaskDlgt),this._invokeTaskCurrZone=r&&(r.onInvokeTask?this._zone:i._invokeTaskCurrZone),this._cancelTaskZS=r&&(r.onCancelTask?r:i._cancelTaskZS),this._cancelTaskDlgt=r&&(r.onCancelTask?i:i._cancelTaskDlgt),this._cancelTaskCurrZone=r&&(r.onCancelTask?this._zone:i._cancelTaskCurrZone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;let E=r&&r.onHasTask,x=i&&i._hasTaskZS;(E||x)&&(this._hasTaskZS=E?r:c,this._hasTaskDlgt=i,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=this._zone,r.onScheduleTask||(this._scheduleTaskZS=c,this._scheduleTaskDlgt=i,this._scheduleTaskCurrZone=this._zone),r.onInvokeTask||(this._invokeTaskZS=c,this._invokeTaskDlgt=i,this._invokeTaskCurrZone=this._zone),r.onCancelTask||(this._cancelTaskZS=c,this._cancelTaskDlgt=i,this._cancelTaskCurrZone=this._zone))}fork(s,i){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,s,i):new e(s,i)}intercept(s,i,r){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,s,i,r):i}invoke(s,i,r,E,x){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,s,i,r,E,x):i.apply(r,E)}handleError(s,i){return this._handleErrorZS?this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,s,i):!0}scheduleTask(s,i){let r=i;if(this._scheduleTaskZS)this._hasTaskZS&&r._zoneDelegates.push(this._hasTaskDlgtOwner),r=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,s,i),r||(r=i);else if(i.scheduleFn)i.scheduleFn(i);else if(i.type==F)z(i);else throw new Error("Task is missing scheduleFn.");return r}invokeTask(s,i,r,E){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,s,i,r,E):i.callback.apply(r,E)}cancelTask(s,i){let r;if(this._cancelTaskZS)r=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,s,i);else{if(!i.cancelFn)throw Error("Task is not cancelable");r=i.cancelFn(i)}return r}hasTask(s,i){try{this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,s,i)}catch(r){this.handleError(s,r)}}_updateTaskCount(s,i){let r=this._taskCounts,E=r[s],x=r[s]=E+i;if(x<0)throw new Error("More tasks executed then were scheduled.");if(E==0||x==0){let ee={microTask:r.microTask>0,macroTask:r.macroTask>0,eventTask:r.eventTask>0,change:s};this.hasTask(this._zone,ee)}}}class g{type;source;invoke;callback;data;scheduleFn;cancelFn;_zone=null;runCount=0;_zoneDelegates=null;_state="notScheduled";constructor(s,i,r,E,x,ee){if(this.type=s,this.source=i,this.data=E,this.scheduleFn=x,this.cancelFn=ee,!r)throw new Error("callback is not defined");this.callback=r;let M=this;s===U&&E&&E.useG?this.invoke=g.invokeTask:this.invoke=function(){return g.invokeTask.call(ce,M,this,arguments)}}static invokeTask(s,i,r){s||(s=this),K++;try{return s.runCount++,s.zone.runTask(s,i,r)}finally{K==1&&$(),K--}}get zone(){return this._zone}get state(){return this._state}cancelScheduleRequest(){this._transitionTo(q,p)}_transitionTo(s,i,r){if(this._state===i||this._state===r)this._state=s,s==q&&(this._zoneDelegates=null);else throw new Error(`${this.type} '${this.source}': can not transition to '${s}', expecting state '${i}'${r?" or '"+r+"'":""}, was '${this._state}'.`)}toString(){return this.data&&typeof this.data.handleId<"u"?this.data.handleId.toString():Object.prototype.toString.call(this)}toJSON(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}}}let T=te("setTimeout"),y=te("Promise"),w=te("then"),_=[],P=!1,L;function H(I){if(L||ce[y]&&(L=ce[y].resolve(0)),L){let s=L[w];s||(s=L.then),s.call(L,I)}else ce[T](I,0)}function z(I){K===0&&_.length===0&&H($),I&&_.push(I)}function $(){if(!P){for(P=!0;_.length;){let I=_;_=[];for(let s=0;s<I.length;s++){let i=I[s];try{i.zone.runTask(i,null,null)}catch(r){R.onUnhandledError(r)}}}R.microtaskDrainDone(),P=!1}}let J={name:"NO ZONE"},q="notScheduled",p="scheduling",d="scheduled",A="running",V="canceling",X="unknown",F="microTask",k="macroTask",U="eventTask",S={},R={symbol:te,currentZoneFrame:()=>b,onUnhandledError:W,microtaskDrainDone:W,scheduleMicroTask:z,showUncaughtError:()=>!e[te("ignoreConsoleErrorUncaughtError")],patchEventTarget:()=>[],patchOnProperties:W,patchMethod:()=>W,bindArguments:()=>[],patchThen:()=>W,patchMacroTask:()=>W,patchEventPrototype:()=>W,isIEOrEdge:()=>!1,getGlobalObjects:()=>{},ObjectDefineProperty:()=>W,ObjectGetOwnPropertyDescriptor:()=>{},ObjectCreate:()=>{},ArraySlice:()=>[],patchClass:()=>W,wrapWithCurrentZone:()=>W,filterProperties:()=>[],attachOriginToPatched:()=>W,_redefineProperty:()=>W,patchCallbacks:()=>W,nativeScheduleMicroTask:H},b={parent:null,zone:new e(null,null)},D=null,K=0;function W(){}return a("Zone","Zone"),e}function dt(){let t=globalThis,n=t[te("forceDuplicateZoneCheck")]===!0;if(t.Zone&&(n||typeof t.Zone.__symbol__!="function"))throw new Error("Zone already loaded.");return t.Zone??=ht(),t.Zone}var pe=Object.getOwnPropertyDescriptor,Me=Object.defineProperty,Ae=Object.getPrototypeOf,_t=Object.create,Tt=Array.prototype.slice,je="addEventListener",He="removeEventListener",Ne=te(je),Ze=te(He),ae="true",le="false",ve=te("");function Ve(t,n){return Zone.current.wrap(t,n)}function xe(t,n,a,e,c){return Zone.current.scheduleMacroTask(t,n,a,e,c)}var j=te,we=typeof window<"u",be=we?window:void 0,Y=we&&be||globalThis,Et="removeAttribute";function Fe(t,n){for(let a=t.length-1;a>=0;a--)typeof t[a]=="function"&&(t[a]=Ve(t[a],n+"_"+a));return t}function gt(t,n){let a=t.constructor.name;for(let e=0;e<n.length;e++){let c=n[e],f=t[c];if(f){let g=pe(t,c);if(!et(g))continue;t[c]=(T=>{let y=function(){return T.apply(this,Fe(arguments,a+"."+c))};return fe(y,T),y})(f)}}}function et(t){return t?t.writable===!1?!1:!(typeof t.get=="function"&&typeof t.set>"u"):!0}var tt=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope,De=!("nw"in Y)&&typeof Y.process<"u"&&Y.process.toString()==="[object process]",Ge=!De&&!tt&&!!(we&&be.HTMLElement),nt=typeof Y.process<"u"&&Y.process.toString()==="[object process]"&&!tt&&!!(we&&be.HTMLElement),Ce={},kt=j("enable_beforeunload"),Xe=function(t){if(t=t||Y.event,!t)return;let n=Ce[t.type];n||(n=Ce[t.type]=j("ON_PROPERTY"+t.type));let a=this||t.target||Y,e=a[n],c;if(Ge&&a===be&&t.type==="error"){let f=t;c=e&&e.call(this,f.message,f.filename,f.lineno,f.colno,f.error),c===!0&&t.preventDefault()}else c=e&&e.apply(this,arguments),t.type==="beforeunload"&&Y[kt]&&typeof c=="string"?t.returnValue=c:c!=null&&!c&&t.preventDefault();return c};function Ye(t,n,a){let e=pe(t,n);if(!e&&a&&pe(a,n)&&(e={enumerable:!0,configurable:!0}),!e||!e.configurable)return;let c=j("on"+n+"patched");if(t.hasOwnProperty(c)&&t[c])return;delete e.writable,delete e.value;let f=e.get,g=e.set,T=n.slice(2),y=Ce[T];y||(y=Ce[T]=j("ON_PROPERTY"+T)),e.set=function(w){let _=this;if(!_&&t===Y&&(_=Y),!_)return;typeof _[y]=="function"&&_.removeEventListener(T,Xe),g?.call(_,null),_[y]=w,typeof w=="function"&&_.addEventListener(T,Xe,!1)},e.get=function(){let w=this;if(!w&&t===Y&&(w=Y),!w)return null;let _=w[y];if(_)return _;if(f){let P=f.call(this);if(P)return e.set.call(this,P),typeof w[Et]=="function"&&w.removeAttribute(n),P}return null},Me(t,n,e),t[c]=!0}function rt(t,n,a){if(n)for(let e=0;e<n.length;e++)Ye(t,"on"+n[e],a);else{let e=[];for(let c in t)c.slice(0,2)=="on"&&e.push(c);for(let c=0;c<e.length;c++)Ye(t,e[c],a)}}var oe=j("originalInstance");function ye(t){let n=Y[t];if(!n)return;Y[j(t)]=n,Y[t]=function(){let c=Fe(arguments,t);switch(c.length){case 0:this[oe]=new n;break;case 1:this[oe]=new n(c[0]);break;case 2:this[oe]=new n(c[0],c[1]);break;case 3:this[oe]=new n(c[0],c[1],c[2]);break;case 4:this[oe]=new n(c[0],c[1],c[2],c[3]);break;default:throw new Error("Arg list too long.")}},fe(Y[t],n);let a=new n(function(){}),e;for(e in a)t==="XMLHttpRequest"&&e==="responseBlob"||function(c){typeof a[c]=="function"?Y[t].prototype[c]=function(){return this[oe][c].apply(this[oe],arguments)}:Me(Y[t].prototype,c,{set:function(f){typeof f=="function"?(this[oe][c]=Ve(f,t+"."+c),fe(this[oe][c],f)):this[oe][c]=f},get:function(){return this[oe][c]}})}(e);for(e in n)e!=="prototype"&&n.hasOwnProperty(e)&&(Y[t][e]=n[e])}function ue(t,n,a){let e=t;for(;e&&!e.hasOwnProperty(n);)e=Ae(e);!e&&t[n]&&(e=t);let c=j(n),f=null;if(e&&(!(f=e[c])||!e.hasOwnProperty(c))){f=e[c]=e[n];let g=e&&pe(e,n);if(et(g)){let T=a(f,c,n);e[n]=function(){return T(this,arguments)},fe(e[n],f)}}return f}function mt(t,n,a){let e=null;function c(f){let g=f.data;return g.args[g.cbIdx]=function(){f.invoke.apply(this,arguments)},e.apply(g.target,g.args),f}e=ue(t,n,f=>function(g,T){let y=a(g,T);return y.cbIdx>=0&&typeof T[y.cbIdx]=="function"?xe(y.name,T[y.cbIdx],y,c):f.apply(g,T)})}function fe(t,n){t[j("OriginalDelegate")]=n}var $e=!1,Le=!1;function yt(){if($e)return Le;$e=!0;try{let t=be.navigator.userAgent;(t.indexOf("MSIE ")!==-1||t.indexOf("Trident/")!==-1||t.indexOf("Edge/")!==-1)&&(Le=!0)}catch{}return Le}function Je(t){return typeof t=="function"}function Ke(t){return typeof t=="number"}var pt={useG:!0},ne={},ot={},st=new RegExp("^"+ve+"(\\w+)(true|false)$"),it=j("propagationStopped");function ct(t,n){let a=(n?n(t):t)+le,e=(n?n(t):t)+ae,c=ve+a,f=ve+e;ne[t]={},ne[t][le]=c,ne[t][ae]=f}function vt(t,n,a,e){let c=e&&e.add||je,f=e&&e.rm||He,g=e&&e.listeners||"eventListeners",T=e&&e.rmAll||"removeAllListeners",y=j(c),w="."+c+":",_="prependListener",P="."+_+":",L=function(p,d,A){if(p.isRemoved)return;let V=p.callback;typeof V=="object"&&V.handleEvent&&(p.callback=k=>V.handleEvent(k),p.originalDelegate=V);let X;try{p.invoke(p,d,[A])}catch(k){X=k}let F=p.options;if(F&&typeof F=="object"&&F.once){let k=p.originalDelegate?p.originalDelegate:p.callback;d[f].call(d,A.type,k,F)}return X};function H(p,d,A){if(d=d||t.event,!d)return;let V=p||d.target||t,X=V[ne[d.type][A?ae:le]];if(X){let F=[];if(X.length===1){let k=L(X[0],V,d);k&&F.push(k)}else{let k=X.slice();for(let U=0;U<k.length&&!(d&&d[it]===!0);U++){let S=L(k[U],V,d);S&&F.push(S)}}if(F.length===1)throw F[0];for(let k=0;k<F.length;k++){let U=F[k];n.nativeScheduleMicroTask(()=>{throw U})}}}let z=function(p){return H(this,p,!1)},$=function(p){return H(this,p,!0)};function J(p,d){if(!p)return!1;let A=!0;d&&d.useG!==void 0&&(A=d.useG);let V=d&&d.vh,X=!0;d&&d.chkDup!==void 0&&(X=d.chkDup);let F=!1;d&&d.rt!==void 0&&(F=d.rt);let k=p;for(;k&&!k.hasOwnProperty(c);)k=Ae(k);if(!k&&p[c]&&(k=p),!k||k[y])return!1;let U=d&&d.eventNameToString,S={},R=k[y]=k[c],b=k[j(f)]=k[f],D=k[j(g)]=k[g],K=k[j(T)]=k[T],W;d&&d.prepend&&(W=k[j(d.prepend)]=k[d.prepend]);function I(o,u){return u?typeof o=="boolean"?{capture:o,passive:!0}:o?typeof o=="object"&&o.passive!==!1?{...o,passive:!0}:o:{passive:!0}:o}let s=function(o){if(!S.isExisting)return R.call(S.target,S.eventName,S.capture?$:z,S.options)},i=function(o){if(!o.isRemoved){let u=ne[o.eventName],v;u&&(v=u[o.capture?ae:le]);let C=v&&o.target[v];if(C){for(let m=0;m<C.length;m++)if(C[m]===o){C.splice(m,1),o.isRemoved=!0,o.removeAbortListener&&(o.removeAbortListener(),o.removeAbortListener=null),C.length===0&&(o.allRemoved=!0,o.target[v]=null);break}}}if(o.allRemoved)return b.call(o.target,o.eventName,o.capture?$:z,o.options)},r=function(o){return R.call(S.target,S.eventName,o.invoke,S.options)},E=function(o){return W.call(S.target,S.eventName,o.invoke,S.options)},x=function(o){return b.call(o.target,o.eventName,o.invoke,o.options)},ee=A?s:r,M=A?i:x,he=function(o,u){let v=typeof u;return v==="function"&&o.callback===u||v==="object"&&o.originalDelegate===u},_e=d?.diff||he,Q=Zone[j("UNPATCHED_EVENTS")],Te=t[j("PASSIVE_EVENTS")];function h(o){if(typeof o=="object"&&o!==null){let u={...o};return o.signal&&(u.signal=o.signal),u}return o}let l=function(o,u,v,C,m=!1,O=!1){return function(){let N=this||t,Z=arguments[0];d&&d.transferEventName&&(Z=d.transferEventName(Z));let G=arguments[1];if(!G)return o.apply(this,arguments);if(De&&Z==="uncaughtException")return o.apply(this,arguments);let B=!1;if(typeof G!="function"){if(!G.handleEvent)return o.apply(this,arguments);B=!0}if(V&&!V(o,G,N,arguments))return;let de=!!Te&&Te.indexOf(Z)!==-1,se=h(I(arguments[2],de)),Ee=se?.signal;if(Ee?.aborted)return;if(Q){for(let ie=0;ie<Q.length;ie++)if(Z===Q[ie])return de?o.call(N,Z,G,se):o.apply(this,arguments)}let Se=se?typeof se=="boolean"?!0:se.capture:!1,Be=se&&typeof se=="object"?se.once:!1,ft=Zone.current,Oe=ne[Z];Oe||(ct(Z,U),Oe=ne[Z]);let ze=Oe[Se?ae:le],ge=N[ze],Ue=!1;if(ge){if(Ue=!0,X){for(let ie=0;ie<ge.length;ie++)if(_e(ge[ie],G))return}}else ge=N[ze]=[];let Pe,We=N.constructor.name,qe=ot[We];qe&&(Pe=qe[Z]),Pe||(Pe=We+u+(U?U(Z):Z)),S.options=se,Be&&(S.options.once=!1),S.target=N,S.capture=Se,S.eventName=Z,S.isExisting=Ue;let me=A?pt:void 0;me&&(me.taskData=S),Ee&&(S.options.signal=void 0);let re=ft.scheduleEventTask(Pe,G,me,v,C);if(Ee){S.options.signal=Ee;let ie=()=>re.zone.cancelTask(re);o.call(Ee,"abort",ie,{once:!0}),re.removeAbortListener=()=>Ee.removeEventListener("abort",ie)}if(S.target=null,me&&(me.taskData=null),Be&&(S.options.once=!0),typeof re.options!="boolean"&&(re.options=se),re.target=N,re.capture=Se,re.eventName=Z,B&&(re.originalDelegate=G),O?ge.unshift(re):ge.push(re),m)return N}};return k[c]=l(R,w,ee,M,F),W&&(k[_]=l(W,P,E,M,F,!0)),k[f]=function(){let o=this||t,u=arguments[0];d&&d.transferEventName&&(u=d.transferEventName(u));let v=arguments[2],C=v?typeof v=="boolean"?!0:v.capture:!1,m=arguments[1];if(!m)return b.apply(this,arguments);if(V&&!V(b,m,o,arguments))return;let O=ne[u],N;O&&(N=O[C?ae:le]);let Z=N&&o[N];if(Z)for(let G=0;G<Z.length;G++){let B=Z[G];if(_e(B,m)){if(Z.splice(G,1),B.isRemoved=!0,Z.length===0&&(B.allRemoved=!0,o[N]=null,!C&&typeof u=="string")){let de=ve+"ON_PROPERTY"+u;o[de]=null}return B.zone.cancelTask(B),F?o:void 0}}return b.apply(this,arguments)},k[g]=function(){let o=this||t,u=arguments[0];d&&d.transferEventName&&(u=d.transferEventName(u));let v=[],C=at(o,U?U(u):u);for(let m=0;m<C.length;m++){let O=C[m],N=O.originalDelegate?O.originalDelegate:O.callback;v.push(N)}return v},k[T]=function(){let o=this||t,u=arguments[0];if(u){d&&d.transferEventName&&(u=d.transferEventName(u));let v=ne[u];if(v){let C=v[le],m=v[ae],O=o[C],N=o[m];if(O){let Z=O.slice();for(let G=0;G<Z.length;G++){let B=Z[G],de=B.originalDelegate?B.originalDelegate:B.callback;this[f].call(this,u,de,B.options)}}if(N){let Z=N.slice();for(let G=0;G<Z.length;G++){let B=Z[G],de=B.originalDelegate?B.originalDelegate:B.callback;this[f].call(this,u,de,B.options)}}}}else{let v=Object.keys(o);for(let C=0;C<v.length;C++){let m=v[C],O=st.exec(m),N=O&&O[1];N&&N!=="removeListener"&&this[T].call(this,N)}this[T].call(this,"removeListener")}if(F)return this},fe(k[c],R),fe(k[f],b),K&&fe(k[T],K),D&&fe(k[g],D),!0}let q=[];for(let p=0;p<a.length;p++)q[p]=J(a[p],e);return q}function at(t,n){if(!n){let f=[];for(let g in t){let T=st.exec(g),y=T&&T[1];if(y&&(!n||y===n)){let w=t[g];if(w)for(let _=0;_<w.length;_++)f.push(w[_])}}return f}let a=ne[n];a||(ct(n),a=ne[n]);let e=t[a[le]],c=t[a[ae]];return e?c?e.concat(c):e.slice():c?c.slice():[]}function bt(t,n){let a=t.Event;a&&a.prototype&&n.patchMethod(a.prototype,"stopImmediatePropagation",e=>function(c,f){c[it]=!0,e&&e.apply(c,f)})}function Pt(t,n){n.patchMethod(t,"queueMicrotask",a=>function(e,c){Zone.current.scheduleMicroTask("queueMicrotask",c[0])})}var Re=j("zoneTask");function ke(t,n,a,e){let c=null,f=null;n+=e,a+=e;let g={};function T(w){let _=w.data;_.args[0]=function(){return w.invoke.apply(this,arguments)};let P=c.apply(t,_.args);return Ke(P)?_.handleId=P:(_.handle=P,_.isRefreshable=Je(P.refresh)),w}function y(w){let{handle:_,handleId:P}=w.data;return f.call(t,_??P)}c=ue(t,n,w=>function(_,P){if(Je(P[0])){let L={isRefreshable:!1,isPeriodic:e==="Interval",delay:e==="Timeout"||e==="Interval"?P[1]||0:void 0,args:P},H=P[0];P[0]=function(){try{return H.apply(this,arguments)}finally{let{handle:A,handleId:V,isPeriodic:X,isRefreshable:F}=L;!X&&!F&&(V?delete g[V]:A&&(A[Re]=null))}};let z=xe(n,P[0],L,T,y);if(!z)return z;let{handleId:$,handle:J,isRefreshable:q,isPeriodic:p}=z.data;if($)g[$]=z;else if(J&&(J[Re]=z,q&&!p)){let d=J.refresh;J.refresh=function(){let{zone:A,state:V}=z;return V==="notScheduled"?(z._state="scheduled",A._updateTaskCount(z,1)):V==="running"&&(z._state="scheduling"),d.call(this)}}return J??$??z}else return w.apply(t,P)}),f=ue(t,a,w=>function(_,P){let L=P[0],H;Ke(L)?(H=g[L],delete g[L]):(H=L?.[Re],H?L[Re]=null:H=L),H?.type?H.cancelFn&&H.zone.cancelTask(H):w.apply(t,P)})}function Rt(t,n){let{isBrowser:a,isMix:e}=n.getGlobalObjects();if(!a&&!e||!t.customElements||!("customElements"in t))return;let c=["connectedCallback","disconnectedCallback","adoptedCallback","attributeChangedCallback","formAssociatedCallback","formDisabledCallback","formResetCallback","formStateRestoreCallback"];n.patchCallbacks(n,t.customElements,"customElements","define",c)}function Ct(t,n){if(Zone[n.symbol("patchEventTarget")])return;let{eventNames:a,zoneSymbolEventNames:e,TRUE_STR:c,FALSE_STR:f,ZONE_SYMBOL_PREFIX:g}=n.getGlobalObjects();for(let y=0;y<a.length;y++){let w=a[y],_=w+f,P=w+c,L=g+_,H=g+P;e[w]={},e[w][f]=L,e[w][c]=H}let T=t.EventTarget;if(!(!T||!T.prototype))return n.patchEventTarget(t,n,[T&&T.prototype]),!0}function wt(t,n){n.patchEventPrototype(t,n)}function lt(t,n,a){if(!a||a.length===0)return n;let e=a.filter(f=>f.target===t);if(e.length===0)return n;let c=e[0].ignoreProperties;return n.filter(f=>c.indexOf(f)===-1)}function Qe(t,n,a,e){if(!t)return;let c=lt(t,n,a);rt(t,c,e)}function Ie(t){return Object.getOwnPropertyNames(t).filter(n=>n.startsWith("on")&&n.length>2).map(n=>n.substring(2))}function Dt(t,n){if(De&&!nt||Zone[t.symbol("patchEvents")])return;let a=n.__Zone_ignore_on_properties,e=[];if(Ge){let c=window;e=e.concat(["Document","SVGElement","Element","HTMLElement","HTMLBodyElement","HTMLMediaElement","HTMLFrameSetElement","HTMLFrameElement","HTMLIFrameElement","HTMLMarqueeElement","Worker"]);let f=[];Qe(c,Ie(c),a&&a.concat(f),Ae(c))}e=e.concat(["XMLHttpRequest","XMLHttpRequestEventTarget","IDBIndex","IDBRequest","IDBOpenDBRequest","IDBDatabase","IDBTransaction","IDBCursor","WebSocket"]);for(let c=0;c<e.length;c++){let f=n[e[c]];f?.prototype&&Qe(f.prototype,Ie(f.prototype),a)}}function St(t){t.__load_patch("legacy",n=>{let a=n[t.__symbol__("legacyPatch")];a&&a()}),t.__load_patch("timers",n=>{let a="set",e="clear";ke(n,a,e,"Timeout"),ke(n,a,e,"Interval"),ke(n,a,e,"Immediate")}),t.__load_patch("requestAnimationFrame",n=>{ke(n,"request","cancel","AnimationFrame"),ke(n,"mozRequest","mozCancel","AnimationFrame"),ke(n,"webkitRequest","webkitCancel","AnimationFrame")}),t.__load_patch("blocking",(n,a)=>{let e=["alert","prompt","confirm"];for(let c=0;c<e.length;c++){let f=e[c];ue(n,f,(g,T,y)=>function(w,_){return a.current.run(g,n,_,y)})}}),t.__load_patch("EventTarget",(n,a,e)=>{wt(n,e),Ct(n,e);let c=n.XMLHttpRequestEventTarget;c&&c.prototype&&e.patchEventTarget(n,e,[c.prototype])}),t.__load_patch("MutationObserver",(n,a,e)=>{ye("MutationObserver"),ye("WebKitMutationObserver")}),t.__load_patch("IntersectionObserver",(n,a,e)=>{ye("IntersectionObserver")}),t.__load_patch("FileReader",(n,a,e)=>{ye("FileReader")}),t.__load_patch("on_property",(n,a,e)=>{Dt(e,n)}),t.__load_patch("customElements",(n,a,e)=>{Rt(n,e)}),t.__load_patch("XHR",(n,a)=>{w(n);let e=j("xhrTask"),c=j("xhrSync"),f=j("xhrListener"),g=j("xhrScheduled"),T=j("xhrURL"),y=j("xhrErrorBeforeScheduled");function w(_){let P=_.XMLHttpRequest;if(!P)return;let L=P.prototype;function H(R){return R[e]}let z=L[Ne],$=L[Ze];if(!z){let R=_.XMLHttpRequestEventTarget;if(R){let b=R.prototype;z=b[Ne],$=b[Ze]}}let J="readystatechange",q="scheduled";function p(R){let b=R.data,D=b.target;D[g]=!1,D[y]=!1;let K=D[f];z||(z=D[Ne],$=D[Ze]),K&&$.call(D,J,K);let W=D[f]=()=>{if(D.readyState===D.DONE)if(!b.aborted&&D[g]&&R.state===q){let s=D[a.__symbol__("loadfalse")];if(D.status!==0&&s&&s.length>0){let i=R.invoke;R.invoke=function(){let r=D[a.__symbol__("loadfalse")];for(let E=0;E<r.length;E++)r[E]===R&&r.splice(E,1);!b.aborted&&R.state===q&&i.call(R)},s.push(R)}else R.invoke()}else!b.aborted&&D[g]===!1&&(D[y]=!0)};return z.call(D,J,W),D[e]||(D[e]=R),U.apply(D,b.args),D[g]=!0,R}function d(){}function A(R){let b=R.data;return b.aborted=!0,S.apply(b.target,b.args)}let V=ue(L,"open",()=>function(R,b){return R[c]=b[2]==!1,R[T]=b[1],V.apply(R,b)}),X="XMLHttpRequest.send",F=j("fetchTaskAborting"),k=j("fetchTaskScheduling"),U=ue(L,"send",()=>function(R,b){if(a.current[k]===!0||R[c])return U.apply(R,b);{let D={target:R,url:R[T],isPeriodic:!1,args:b,aborted:!1},K=xe(X,d,D,p,A);R&&R[y]===!0&&!D.aborted&&K.state===q&&K.invoke()}}),S=ue(L,"abort",()=>function(R,b){let D=H(R);if(D&&typeof D.type=="string"){if(D.cancelFn==null||D.data&&D.data.aborted)return;D.zone.cancelTask(D)}else if(a.current[F]===!0)return S.apply(R,b)})}}),t.__load_patch("geolocation",n=>{n.navigator&&n.navigator.geolocation&&gt(n.navigator.geolocation,["getCurrentPosition","watchPosition"])}),t.__load_patch("PromiseRejectionEvent",(n,a)=>{function e(c){return function(f){at(n,c).forEach(T=>{let y=n.PromiseRejectionEvent;if(y){let w=new y(c,{promise:f.promise,reason:f.rejection});T.invoke(w)}})}}n.PromiseRejectionEvent&&(a[j("unhandledPromiseRejectionHandler")]=e("unhandledrejection"),a[j("rejectionHandledHandler")]=e("rejectionhandled"))}),t.__load_patch("queueMicrotask",(n,a,e)=>{Pt(n,e)})}function Ot(t){t.__load_patch("ZoneAwarePromise",(n,a,e)=>{let c=Object.getOwnPropertyDescriptor,f=Object.defineProperty;function g(h){if(h&&h.toString===Object.prototype.toString){let l=h.constructor&&h.constructor.name;return(l||"")+": "+JSON.stringify(h)}return h?h.toString():Object.prototype.toString.call(h)}let T=e.symbol,y=[],w=n[T("DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION")]!==!1,_=T("Promise"),P=T("then"),L="__creationTrace__";e.onUnhandledError=h=>{if(e.showUncaughtError()){let l=h&&h.rejection;l?console.error("Unhandled Promise rejection:",l instanceof Error?l.message:l,"; Zone:",h.zone.name,"; Task:",h.task&&h.task.source,"; Value:",l,l instanceof Error?l.stack:void 0):console.error(h)}},e.microtaskDrainDone=()=>{for(;y.length;){let h=y.shift();try{h.zone.runGuarded(()=>{throw h.throwOriginal?h.rejection:h})}catch(l){z(l)}}};let H=T("unhandledPromiseRejectionHandler");function z(h){e.onUnhandledError(h);try{let l=a[H];typeof l=="function"&&l.call(this,h)}catch{}}function $(h){return h&&typeof h.then=="function"}function J(h){return h}function q(h){return M.reject(h)}let p=T("state"),d=T("value"),A=T("finally"),V=T("parentPromiseValue"),X=T("parentPromiseState"),F="Promise.then",k=null,U=!0,S=!1,R=0;function b(h,l){return o=>{try{I(h,l,o)}catch(u){I(h,!1,u)}}}let D=function(){let h=!1;return function(o){return function(){h||(h=!0,o.apply(null,arguments))}}},K="Promise resolved with itself",W=T("currentTaskTrace");function I(h,l,o){let u=D();if(h===o)throw new TypeError(K);if(h[p]===k){let v=null;try{(typeof o=="object"||typeof o=="function")&&(v=o&&o.then)}catch(C){return u(()=>{I(h,!1,C)})(),h}if(l!==S&&o instanceof M&&o.hasOwnProperty(p)&&o.hasOwnProperty(d)&&o[p]!==k)i(o),I(h,o[p],o[d]);else if(l!==S&&typeof v=="function")try{v.call(o,u(b(h,l)),u(b(h,!1)))}catch(C){u(()=>{I(h,!1,C)})()}else{h[p]=l;let C=h[d];if(h[d]=o,h[A]===A&&l===U&&(h[p]=h[X],h[d]=h[V]),l===S&&o instanceof Error){let m=a.currentTask&&a.currentTask.data&&a.currentTask.data[L];m&&f(o,W,{configurable:!0,enumerable:!1,writable:!0,value:m})}for(let m=0;m<C.length;)r(h,C[m++],C[m++],C[m++],C[m++]);if(C.length==0&&l==S){h[p]=R;let m=o;try{throw new Error("Uncaught (in promise): "+g(o)+(o&&o.stack?`
17
+ `+o.stack:""))}catch(O){m=O}w&&(m.throwOriginal=!0),m.rejection=o,m.promise=h,m.zone=a.current,m.task=a.currentTask,y.push(m),e.scheduleMicroTask()}}}return h}let s=T("rejectionHandledHandler");function i(h){if(h[p]===R){try{let l=a[s];l&&typeof l=="function"&&l.call(this,{rejection:h[d],promise:h})}catch{}h[p]=S;for(let l=0;l<y.length;l++)h===y[l].promise&&y.splice(l,1)}}function r(h,l,o,u,v){i(h);let C=h[p],m=C?typeof u=="function"?u:J:typeof v=="function"?v:q;l.scheduleMicroTask(F,()=>{try{let O=h[d],N=!!o&&A===o[A];N&&(o[V]=O,o[X]=C);let Z=l.run(m,void 0,N&&m!==q&&m!==J?[]:[O]);I(o,!0,Z)}catch(O){I(o,!1,O)}},o)}let E="function ZoneAwarePromise() { [native code] }",x=function(){},ee=n.AggregateError;class M{static toString(){return E}static resolve(l){return l instanceof M?l:I(new this(null),U,l)}static reject(l){return I(new this(null),S,l)}static withResolvers(){let l={};return l.promise=new M((o,u)=>{l.resolve=o,l.reject=u}),l}static any(l){if(!l||typeof l[Symbol.iterator]!="function")return Promise.reject(new ee([],"All promises were rejected"));let o=[],u=0;try{for(let m of l)u++,o.push(M.resolve(m))}catch{return Promise.reject(new ee([],"All promises were rejected"))}if(u===0)return Promise.reject(new ee([],"All promises were rejected"));let v=!1,C=[];return new M((m,O)=>{for(let N=0;N<o.length;N++)o[N].then(Z=>{v||(v=!0,m(Z))},Z=>{C.push(Z),u--,u===0&&(v=!0,O(new ee(C,"All promises were rejected")))})})}static race(l){let o,u,v=new this((O,N)=>{o=O,u=N});function C(O){o(O)}function m(O){u(O)}for(let O of l)$(O)||(O=this.resolve(O)),O.then(C,m);return v}static all(l){return M.allWithCallback(l)}static allSettled(l){return(this&&this.prototype instanceof M?this:M).allWithCallback(l,{thenCallback:u=>({status:"fulfilled",value:u}),errorCallback:u=>({status:"rejected",reason:u})})}static allWithCallback(l,o){let u,v,C=new this((Z,G)=>{u=Z,v=G}),m=2,O=0,N=[];for(let Z of l){$(Z)||(Z=this.resolve(Z));let G=O;try{Z.then(B=>{N[G]=o?o.thenCallback(B):B,m--,m===0&&u(N)},B=>{o?(N[G]=o.errorCallback(B),m--,m===0&&u(N)):v(B)})}catch(B){v(B)}m++,O++}return m-=2,m===0&&u(N),C}constructor(l){let o=this;if(!(o instanceof M))throw new Error("Must be an instanceof Promise.");o[p]=k,o[d]=[];try{let u=D();l&&l(u(b(o,U)),u(b(o,S)))}catch(u){I(o,!1,u)}}get[Symbol.toStringTag](){return"Promise"}get[Symbol.species](){return M}then(l,o){let u=this.constructor?.[Symbol.species];(!u||typeof u!="function")&&(u=this.constructor||M);let v=new u(x),C=a.current;return this[p]==k?this[d].push(C,v,l,o):r(this,C,v,l,o),v}catch(l){return this.then(null,l)}finally(l){let o=this.constructor?.[Symbol.species];(!o||typeof o!="function")&&(o=M);let u=new o(x);u[A]=A;let v=a.current;return this[p]==k?this[d].push(v,u,l,l):r(this,v,u,l,l),u}}M.resolve=M.resolve,M.reject=M.reject,M.race=M.race,M.all=M.all;let he=n[_]=n.Promise;n.Promise=M;let _e=T("thenPatched");function Q(h){let l=h.prototype,o=c(l,"then");if(o&&(o.writable===!1||!o.configurable))return;let u=l.then;l[P]=u,h.prototype.then=function(v,C){return new M((O,N)=>{u.call(this,O,N)}).then(v,C)},h[_e]=!0}e.patchThen=Q;function Te(h){return function(l,o){let u=h.apply(l,o);if(u instanceof M)return u;let v=u.constructor;return v[_e]||Q(v),u}}return he&&(Q(he),ue(n,"fetch",h=>Te(h))),Promise[a.__symbol__("uncaughtPromiseErrors")]=y,M})}function Nt(t){t.__load_patch("toString",n=>{let a=Function.prototype.toString,e=j("OriginalDelegate"),c=j("Promise"),f=j("Error"),g=function(){if(typeof this=="function"){let _=this[e];if(_)return typeof _=="function"?a.call(_):Object.prototype.toString.call(_);if(this===Promise){let P=n[c];if(P)return a.call(P)}if(this===Error){let P=n[f];if(P)return a.call(P)}}return a.call(this)};g[e]=a,Function.prototype.toString=g;let T=Object.prototype.toString,y="[object Promise]";Object.prototype.toString=function(){return typeof Promise=="function"&&this instanceof Promise?y:T.call(this)}})}function Zt(t,n,a,e,c){let f=Zone.__symbol__(e);if(n[f])return;let g=n[f]=n[e];n[e]=function(T,y,w){return y&&y.prototype&&c.forEach(function(_){let P=`${a}.${e}::`+_,L=y.prototype;try{if(L.hasOwnProperty(_)){let H=t.ObjectGetOwnPropertyDescriptor(L,_);H&&H.value?(H.value=t.wrapWithCurrentZone(H.value,P),t._redefineProperty(y.prototype,_,H)):L[_]&&(L[_]=t.wrapWithCurrentZone(L[_],P))}else L[_]&&(L[_]=t.wrapWithCurrentZone(L[_],P))}catch{}}),g.call(n,T,y,w)},t.attachOriginToPatched(n[e],g)}function Lt(t){t.__load_patch("util",(n,a,e)=>{let c=Ie(n);e.patchOnProperties=rt,e.patchMethod=ue,e.bindArguments=Fe,e.patchMacroTask=mt;let f=a.__symbol__("BLACK_LISTED_EVENTS"),g=a.__symbol__("UNPATCHED_EVENTS");n[g]&&(n[f]=n[g]),n[f]&&(a[f]=a[g]=n[f]),e.patchEventPrototype=bt,e.patchEventTarget=vt,e.isIEOrEdge=yt,e.ObjectDefineProperty=Me,e.ObjectGetOwnPropertyDescriptor=pe,e.ObjectCreate=_t,e.ArraySlice=Tt,e.patchClass=ye,e.wrapWithCurrentZone=Ve,e.filterProperties=lt,e.attachOriginToPatched=fe,e._redefineProperty=Object.defineProperty,e.patchCallbacks=Zt,e.getGlobalObjects=()=>({globalSources:ot,zoneSymbolEventNames:ne,eventNames:c,isBrowser:Ge,isMix:nt,isNode:De,TRUE_STR:ae,FALSE_STR:le,ZONE_SYMBOL_PREFIX:ve,ADD_EVENT_LISTENER_STR:je,REMOVE_EVENT_LISTENER_STR:He})})}function It(t){Ot(t),Nt(t),Lt(t)}var ut=dt();It(ut);St(ut);
@@ -51,6 +51,7 @@ from starlette.types import Lifespan
51
51
  from typing_extensions import override
52
52
  from watchdog.events import FileSystemEventHandler
53
53
  from watchdog.observers import Observer
54
+ import yaml
54
55
 
55
56
  from ..agents import RunConfig
56
57
  from ..agents.live_request_queue import LiveRequest
@@ -77,6 +78,7 @@ from ..sessions.database_session_service import DatabaseSessionService
77
78
  from ..sessions.in_memory_session_service import InMemorySessionService
78
79
  from ..sessions.session import Session
79
80
  from ..sessions.vertex_ai_session_service import VertexAiSessionService
81
+ from ..utils.feature_decorator import working_in_progress
80
82
  from .cli_eval import EVAL_SESSION_ID_PREFIX
81
83
  from .cli_eval import EvalStatus
82
84
  from .utils import cleanup
@@ -175,6 +177,7 @@ class AgentRunRequest(common.BaseModel):
175
177
  session_id: str
176
178
  new_message: types.Content
177
179
  streaming: bool = False
180
+ state_delta: Optional[dict[str, Any]] = None
178
181
 
179
182
 
180
183
  class AddSessionToEvalSetRequest(common.BaseModel):
@@ -209,6 +212,14 @@ class GetEventGraphResult(common.BaseModel):
209
212
  dot_src: str
210
213
 
211
214
 
215
+ class AgentBuildRequest(common.BaseModel):
216
+ agent_name: str
217
+ agent_type: str
218
+ model: str
219
+ description: str
220
+ instruction: str
221
+
222
+
212
223
  def get_fast_api_app(
213
224
  *,
214
225
  agents_dir: str,
@@ -513,7 +524,11 @@ def get_fast_api_app(
513
524
  )
514
525
  def list_eval_sets(app_name: str) -> list[str]:
515
526
  """Lists all eval sets for the given app."""
516
- return eval_sets_manager.list_eval_sets(app_name)
527
+ try:
528
+ return eval_sets_manager.list_eval_sets(app_name)
529
+ except NotFoundError as e:
530
+ logger.warning(e)
531
+ return []
517
532
 
518
533
  @app.post(
519
534
  "/apps/{app_name}/eval_sets/{eval_set_id}/add_session",
@@ -803,6 +818,29 @@ def get_fast_api_app(
803
818
  filename=artifact_name,
804
819
  )
805
820
 
821
+ @working_in_progress("builder_save is not ready for use.")
822
+ @app.post("/builder/save", response_model_exclude_none=True)
823
+ async def builder_build(req: AgentBuildRequest):
824
+ base_path = Path.cwd() / agents_dir
825
+ agent = {
826
+ "agent_class": req.agent_type,
827
+ "name": req.agent_name,
828
+ "model": req.model,
829
+ "description": req.description,
830
+ "instruction": f"""{req.instruction}""",
831
+ }
832
+ try:
833
+ agent_dir = os.path.join(base_path, req.agent_name)
834
+ os.makedirs(agent_dir, exist_ok=True)
835
+ file_path = os.path.join(agent_dir, "root_agent.yaml")
836
+ with open(file_path, "w") as file:
837
+ yaml.dump(agent, file, default_flow_style=False)
838
+ agent_loader.load_agent(agent_name=req.agent_name)
839
+ return True
840
+ except Exception as e:
841
+ logger.exception("Error in builder_build: %s", e)
842
+ return False
843
+
806
844
  @app.post("/run", response_model_exclude_none=True)
807
845
  async def agent_run(req: AgentRunRequest) -> list[Event]:
808
846
  session = await session_service.get_session(
@@ -840,6 +878,7 @@ def get_fast_api_app(
840
878
  user_id=req.user_id,
841
879
  session_id=req.session_id,
842
880
  new_message=req.new_message,
881
+ state_delta=req.state_delta,
843
882
  run_config=RunConfig(streaming_mode=stream_mode),
844
883
  ):
845
884
  # Format as SSE data
@@ -1003,6 +1042,7 @@ def get_fast_api_app(
1003
1042
  from a2a.server.request_handlers import DefaultRequestHandler
1004
1043
  from a2a.server.tasks import InMemoryTaskStore
1005
1044
  from a2a.types import AgentCard
1045
+ from a2a.utils.constants import AGENT_CARD_WELL_KNOWN_PATH
1006
1046
 
1007
1047
  from ..a2a.executor.a2a_agent_executor import A2aAgentExecutor
1008
1048
 
@@ -1066,7 +1106,7 @@ def get_fast_api_app(
1066
1106
 
1067
1107
  routes = a2a_app.routes(
1068
1108
  rpc_url=f"/a2a/{app_name}",
1069
- agent_card_url=f"/a2a/{app_name}/.well-known/agent.json",
1109
+ agent_card_url=f"/a2a/{app_name}{AGENT_CARD_WELL_KNOWN_PATH}",
1070
1110
  )
1071
1111
 
1072
1112
  for new_route in routes:
@@ -16,11 +16,16 @@ from __future__ import annotations
16
16
 
17
17
  import importlib
18
18
  import logging
19
+ import os
19
20
  import sys
20
21
  from typing import Optional
21
22
 
23
+ from pydantic import ValidationError
24
+
22
25
  from . import envs
26
+ from ...agents import config_agent_utils
23
27
  from ...agents.base_agent import BaseAgent
28
+ from ...utils.feature_decorator import working_in_progress
24
29
 
25
30
  logger = logging.getLogger("google_adk." + __name__)
26
31
 
@@ -34,6 +39,8 @@ class AgentLoader:
34
39
  agents_dir/{agent_name}.py (with root_agent defined in the module)
35
40
  c) {agent_name} as a package name
36
41
  agents_dir/{agent_name}/__init__.py (with root_agent in the package)
42
+ d) {agent_name} as a YAML config folder:
43
+ agents_dir/{agent_name}/root_agent.yaml defines the root agent
37
44
 
38
45
  """
39
46
 
@@ -128,6 +135,29 @@ class AgentLoader:
128
135
 
129
136
  return None
130
137
 
138
+ @working_in_progress("_load_from_yaml_config is not ready for use.")
139
+ def _load_from_yaml_config(self, agent_name: str) -> Optional[BaseAgent]:
140
+ # Load from the config file at agents_dir/{agent_name}/root_agent.yaml
141
+ config_path = os.path.join(self.agents_dir, agent_name, "root_agent.yaml")
142
+ try:
143
+ agent = config_agent_utils.from_config(config_path)
144
+ logger.info("Loaded root agent for %s from %s", agent_name, config_path)
145
+ return agent
146
+ except FileNotFoundError:
147
+ logger.debug("Config file %s not found.", config_path)
148
+ return None
149
+ except ValidationError as e:
150
+ logger.error("Config file %s is invalid YAML.", config_path)
151
+ raise e
152
+ except Exception as e:
153
+ if hasattr(e, "msg"):
154
+ e.msg = f"Fail to load '{config_path}' config. " + e.msg
155
+ raise e
156
+ e.args = (
157
+ f"Fail to load '{config_path}' config. {e.args[0] if e.args else ''}",
158
+ ) + e.args[1:]
159
+ raise e
160
+
131
161
  def _perform_load(self, agent_name: str) -> BaseAgent:
132
162
  """Internal logic to load an agent"""
133
163
  # Add self.agents_dir to sys.path
@@ -145,10 +175,14 @@ class AgentLoader:
145
175
  if root_agent := self._load_from_submodule(agent_name):
146
176
  return root_agent
147
177
 
178
+ if root_agent := self._load_from_yaml_config(agent_name):
179
+ return root_agent
180
+
148
181
  # If no root_agent was found by any pattern
149
182
  raise ValueError(
150
183
  f"No root_agent found for '{agent_name}'. Searched in"
151
- f" '{agent_name}.agent.root_agent', '{agent_name}.root_agent'."
184
+ f" '{agent_name}.agent.root_agent', '{agent_name}.root_agent' and"
185
+ f" '{agent_name}/root_agent.yaml'."
152
186
  f" Ensure '{self.agents_dir}/{agent_name}' is structured correctly,"
153
187
  " an .env file can be loaded if present, and a root_agent is"
154
188
  " exposed."
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import abc
16
18
  from typing import List
17
19
 
@@ -42,42 +44,35 @@ class BaseCodeExecutor(BaseModel):
42
44
  """
43
45
 
44
46
  optimize_data_file: bool = False
45
- """
46
- If true, extract and process data files from the model request
47
+ """If true, extract and process data files from the model request
47
48
  and attach them to the code executor.
48
- Supported data file MimeTypes are [text/csv].
49
49
 
50
+ Supported data file MimeTypes are [text/csv].
50
51
  Default to False.
51
52
  """
52
53
 
53
54
  stateful: bool = False
54
- """
55
- Whether the code executor is stateful. Default to False.
56
- """
55
+ """Whether the code executor is stateful. Default to False."""
57
56
 
58
57
  error_retry_attempts: int = 2
59
- """
60
- The number of attempts to retry on consecutive code execution errors. Default to 2.
61
- """
58
+ """The number of attempts to retry on consecutive code execution errors. Default to 2."""
62
59
 
63
60
  code_block_delimiters: List[tuple[str, str]] = [
64
61
  ('```tool_code\n', '\n```'),
65
62
  ('```python\n', '\n```'),
66
63
  ]
67
- """
68
- The list of the enclosing delimiters to identify the code blocks.
69
- For example, the delimiter ('```python\n', '\n```') can be
70
- used to identify code blocks with the following format:
64
+ """The list of the enclosing delimiters to identify the code blocks.
71
65
 
72
- ```python
73
- print("hello")
74
- ```
66
+ For example, the delimiter ('```python\\n', '\\n```') can be
67
+ used to identify code blocks with the following format::
68
+
69
+ ```python
70
+ print("hello")
71
+ ```
75
72
  """
76
73
 
77
74
  execution_result_delimiters: tuple[str, str] = ('```tool_output\n', '\n```')
78
- """
79
- The delimiters to format the code execution result.
80
- """
75
+ """The delimiters to format the code execution result."""
81
76
 
82
77
  @abc.abstractmethod
83
78
  def execute_code(
@@ -12,11 +12,14 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  from google.genai import types
16
18
  from typing_extensions import override
17
19
 
18
20
  from ..agents.invocation_context import InvocationContext
19
21
  from ..models import LlmRequest
22
+ from ..utils.model_name_utils import is_gemini_2_model
20
23
  from .base_code_executor import BaseCodeExecutor
21
24
  from .code_execution_utils import CodeExecutionInput
22
25
  from .code_execution_utils import CodeExecutionResult
@@ -39,7 +42,7 @@ class BuiltInCodeExecutor(BaseCodeExecutor):
39
42
 
40
43
  def process_llm_request(self, llm_request: LlmRequest) -> None:
41
44
  """Pre-process the LLM request for Gemini 2.0+ models to use the code execution tool."""
42
- if llm_request.model and llm_request.model.startswith("gemini-2"):
45
+ if is_gemini_2_model(llm_request.model):
43
46
  llm_request.config = llm_request.config or types.GenerateContentConfig()
44
47
  llm_request.config.tools = llm_request.config.tools or []
45
48
  llm_request.config.tools.append(
@@ -16,6 +16,7 @@ from __future__ import annotations
16
16
 
17
17
  from abc import ABC
18
18
  from abc import abstractmethod
19
+ from enum import Enum
19
20
  from typing import AsyncGenerator
20
21
  from typing import Optional
21
22
 
@@ -41,6 +42,17 @@ class EvaluateConfig(BaseModel):
41
42
  description="""The list of metrics to be used in Eval.""",
42
43
  )
43
44
 
45
+ parallelism: int = Field(
46
+ default=4,
47
+ description="""Number of parallel evaluations to run during an Eval. Few
48
+ factors to consider while changing this value:
49
+
50
+ 1) Your available quota with the model, especially for those metrics that use
51
+ a model as a judge. Models tend to enforce per-minute or per-second SLAs. Using
52
+ a larger value could result in the eval quickly consuming the quota.
53
+ """,
54
+ )
55
+
44
56
 
45
57
  class InferenceConfig(BaseModel):
46
58
  """Contains configurations need to run inferences."""
@@ -56,6 +68,19 @@ class InferenceConfig(BaseModel):
56
68
  charges.""",
57
69
  )
58
70
 
71
+ parallelism: int = Field(
72
+ default=4,
73
+ description="""Number of parallel inferences to run during an Eval. Few
74
+ factors to consider while changing this value:
75
+
76
+ 1) Your available quota with the model. Models tend to enforce per-minute or
77
+ per-second SLAs. Using a larger value could result in the eval quickly consuming
78
+ the quota.
79
+
80
+ 2) The tools used by the Agent could also have their SLA. Using a larger value
81
+ could also overwhelm those tools.""",
82
+ )
83
+
59
84
 
60
85
  class InferenceRequest(BaseModel):
61
86
  """Represent a request to perform inferences for the eval cases in an eval set."""
@@ -88,6 +113,14 @@ in an eval set are evaluated.
88
113
  )
89
114
 
90
115
 
116
+ class InferenceStatus(Enum):
117
+ """Status of the inference."""
118
+
119
+ UNKNOWN = 0
120
+ SUCCESS = 1
121
+ FAILURE = 2
122
+
123
+
91
124
  class InferenceResult(BaseModel):
92
125
  """Contains inference results for a single eval case."""
93
126
 
@@ -106,14 +139,25 @@ class InferenceResult(BaseModel):
106
139
  description="""Id of the eval case for which inferences were generated.""",
107
140
  )
108
141
 
109
- inferences: list[Invocation] = Field(
110
- description="""Inferences obtained from the Agent for the eval case."""
142
+ inferences: Optional[list[Invocation]] = Field(
143
+ default=None,
144
+ description="""Inferences obtained from the Agent for the eval case.""",
111
145
  )
112
146
 
113
147
  session_id: Optional[str] = Field(
114
148
  description="""Id of the inference session."""
115
149
  )
116
150
 
151
+ status: InferenceStatus = Field(
152
+ default=InferenceStatus.UNKNOWN,
153
+ description="""Status of the inference.""",
154
+ )
155
+
156
+ error_message: Optional[str] = Field(
157
+ default=None,
158
+ description="""Error message if the inference failed.""",
159
+ )
160
+
117
161
 
118
162
  class EvaluateRequest(BaseModel):
119
163
  model_config = ConfigDict(
@@ -137,7 +137,7 @@ class EvaluationGenerator:
137
137
  async def _generate_inferences_from_root_agent(
138
138
  invocations: list[Invocation],
139
139
  root_agent: Agent,
140
- reset_func: Any,
140
+ reset_func: Optional[Any] = None,
141
141
  initial_session: Optional[SessionInput] = None,
142
142
  session_id: Optional[str] = None,
143
143
  session_service: Optional[BaseSessionService] = None,
@@ -0,0 +1,151 @@
1
+ # Copyright 2025 Google LLC
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
17
+ import time
18
+ from typing import Optional
19
+
20
+ from typing_extensions import override
21
+
22
+ from ..errors.not_found_error import NotFoundError
23
+ from .eval_case import EvalCase
24
+ from .eval_set import EvalSet
25
+ from .eval_sets_manager import EvalSetsManager
26
+
27
+
28
+ class InMemoryEvalSetsManager(EvalSetsManager):
29
+ """An in-memory implementation of EvalSetsManager using dictionaries.
30
+
31
+ You can use this class:
32
+ 1) As a part of your testcase.
33
+ 2) For cases where other implementations of EvalSetsManager are too expensive
34
+ to use.
35
+ """
36
+
37
+ def __init__(self):
38
+ # {app_name: {eval_set_id: EvalSet}}
39
+ self._eval_sets: dict[str, dict[str, EvalSet]] = {}
40
+ # {app_name: {eval_set_id: {eval_case_id: EvalCase}}}
41
+ self._eval_cases: dict[str, dict[str, dict[str, EvalCase]]] = {}
42
+
43
+ def _ensure_app_exists(self, app_name: str):
44
+ if app_name not in self._eval_sets:
45
+ self._eval_sets[app_name] = {}
46
+ self._eval_cases[app_name] = {}
47
+
48
+ @override
49
+ def get_eval_set(self, app_name: str, eval_set_id: str) -> Optional[EvalSet]:
50
+ self._ensure_app_exists(app_name)
51
+ return self._eval_sets[app_name].get(eval_set_id, None)
52
+
53
+ @override
54
+ def create_eval_set(self, app_name: str, eval_set_id: str):
55
+ self._ensure_app_exists(app_name)
56
+ if eval_set_id in self._eval_sets[app_name]:
57
+ raise ValueError(
58
+ f"EvalSet {eval_set_id} already exists for app {app_name}."
59
+ )
60
+
61
+ new_eval_set = EvalSet(
62
+ eval_set_id=eval_set_id,
63
+ eval_cases=[],
64
+ creation_timestamp=time.time(),
65
+ )
66
+ self._eval_sets[app_name][eval_set_id] = new_eval_set
67
+ self._eval_cases[app_name][eval_set_id] = {}
68
+
69
+ @override
70
+ def list_eval_sets(self, app_name: str) -> list[str]:
71
+ if app_name not in self._eval_sets:
72
+ return []
73
+
74
+ return list(self._eval_sets[app_name].keys())
75
+
76
+ @override
77
+ def get_eval_case(
78
+ self, app_name: str, eval_set_id: str, eval_case_id: str
79
+ ) -> Optional[EvalCase]:
80
+ if app_name not in self._eval_cases:
81
+ return None
82
+ if eval_set_id not in self._eval_cases[app_name]:
83
+ return None
84
+ return self._eval_cases[app_name][eval_set_id].get(eval_case_id)
85
+
86
+ @override
87
+ def add_eval_case(self, app_name: str, eval_set_id: str, eval_case: EvalCase):
88
+ self._ensure_app_exists(app_name)
89
+ if eval_set_id not in self._eval_sets[app_name]:
90
+ raise NotFoundError(
91
+ f"EvalSet {eval_set_id} not found for app {app_name}."
92
+ )
93
+ if eval_case.eval_id in self._eval_cases[app_name][eval_set_id]:
94
+ raise ValueError(
95
+ f"EvalCase {eval_case.eval_id} already exists in EvalSet"
96
+ f" {eval_set_id} for app {app_name}."
97
+ )
98
+
99
+ self._eval_cases[app_name][eval_set_id][eval_case.eval_id] = eval_case
100
+ # Also update the list in the EvalSet object
101
+ self._eval_sets[app_name][eval_set_id].eval_cases.append(eval_case)
102
+
103
+ @override
104
+ def update_eval_case(
105
+ self, app_name: str, eval_set_id: str, updated_eval_case: EvalCase
106
+ ):
107
+ self._ensure_app_exists(app_name)
108
+ if eval_set_id not in self._eval_sets[app_name]:
109
+ raise NotFoundError(
110
+ f"EvalSet {eval_set_id} not found for app {app_name}."
111
+ )
112
+ if updated_eval_case.eval_id not in self._eval_cases[app_name][eval_set_id]:
113
+ raise NotFoundError(
114
+ f"EvalCase {updated_eval_case.eval_id} not found in EvalSet"
115
+ f" {eval_set_id} for app {app_name}."
116
+ )
117
+
118
+ # Full replace
119
+ self._eval_cases[app_name][eval_set_id][
120
+ updated_eval_case.eval_id
121
+ ] = updated_eval_case
122
+
123
+ # Update the list in the EvalSet object
124
+ eval_set = self._eval_sets[app_name][eval_set_id]
125
+ for i, case in enumerate(eval_set.eval_cases):
126
+ if case.eval_id == updated_eval_case.eval_id:
127
+ eval_set.eval_cases[i] = updated_eval_case
128
+ break
129
+
130
+ @override
131
+ def delete_eval_case(
132
+ self, app_name: str, eval_set_id: str, eval_case_id: str
133
+ ):
134
+ self._ensure_app_exists(app_name)
135
+ if eval_set_id not in self._eval_sets[app_name]:
136
+ raise NotFoundError(
137
+ f"EvalSet {eval_set_id} not found for app {app_name}."
138
+ )
139
+ if eval_case_id not in self._eval_cases[app_name][eval_set_id]:
140
+ raise NotFoundError(
141
+ f"EvalCase {eval_case_id} not found in EvalSet {eval_set_id}"
142
+ f" for app {app_name}."
143
+ )
144
+
145
+ del self._eval_cases[app_name][eval_set_id][eval_case_id]
146
+
147
+ # Remove from the list in the EvalSet object
148
+ eval_set = self._eval_sets[app_name][eval_set_id]
149
+ eval_set.eval_cases = [
150
+ case for case in eval_set.eval_cases if case.eval_id != eval_case_id
151
+ ]