Skip to content

Commit 8eda6fd

Browse files
authored
overhaul provider inventory and agent/model selection (#8652)
Signed-off-by: Bradley Axen <baxen@squareup.com>
1 parent 3d58294 commit 8eda6fd

70 files changed

Lines changed: 5307 additions & 2109 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

crates/goose-acp/acp-meta.json

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,14 @@
5151
"responseType": "GetProviderDetailsResponse"
5252
},
5353
{
54-
"method": "_goose/providers/models",
55-
"requestType": "GetProviderModelsRequest",
56-
"responseType": "GetProviderModelsResponse"
54+
"method": "_goose/providers/inventory",
55+
"requestType": "GetProviderInventoryRequest",
56+
"responseType": "GetProviderInventoryResponse"
57+
},
58+
{
59+
"method": "_goose/providers/inventory/refresh",
60+
"requestType": "RefreshProviderInventoryRequest",
61+
"responseType": "RefreshProviderInventoryResponse"
5762
},
5863
{
5964
"method": "_goose/config/read",

crates/goose-acp/acp-schema.json

Lines changed: 221 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -362,36 +362,224 @@
362362
"contextLimit"
363363
]
364364
},
365-
"GetProviderModelsRequest": {
365+
"GetProviderInventoryRequest": {
366366
"type": "object",
367367
"properties": {
368-
"providerName": {
369-
"type": "string"
368+
"providerIds": {
369+
"type": "array",
370+
"items": {
371+
"type": "string"
372+
},
373+
"description": "Only return entries for these providers. Empty means all.",
374+
"default": []
375+
}
376+
},
377+
"description": "Read per-provider inventory. Always returns immediately from stored state.",
378+
"x-side": "agent",
379+
"x-method": "_goose/providers/inventory"
380+
},
381+
"GetProviderInventoryResponse": {
382+
"type": "object",
383+
"properties": {
384+
"entries": {
385+
"type": "array",
386+
"items": {
387+
"$ref": "#/$defs/ProviderInventoryEntryDto"
388+
}
370389
}
371390
},
372391
"required": [
373-
"providerName"
392+
"entries"
374393
],
375-
"description": "Fetch the full list of models available for a specific provider.",
394+
"description": "Provider inventory response.",
376395
"x-side": "agent",
377-
"x-method": "_goose/providers/models"
396+
"x-method": "_goose/providers/inventory"
378397
},
379-
"GetProviderModelsResponse": {
398+
"ProviderInventoryEntryDto": {
380399
"type": "object",
381400
"properties": {
401+
"providerId": {
402+
"type": "string",
403+
"description": "Provider identifier."
404+
},
405+
"providerName": {
406+
"type": "string",
407+
"description": "Human-readable provider name."
408+
},
409+
"configured": {
410+
"type": "boolean",
411+
"description": "Whether Goose has enough configuration to use this provider."
412+
},
413+
"supportsRefresh": {
414+
"type": "boolean",
415+
"description": "Whether this provider supports background inventory refresh."
416+
},
417+
"refreshing": {
418+
"type": "boolean",
419+
"description": "Whether a refresh is currently in flight."
420+
},
382421
"models": {
422+
"type": "array",
423+
"items": {
424+
"$ref": "#/$defs/ProviderInventoryModelDto"
425+
},
426+
"description": "The list of available models."
427+
},
428+
"lastUpdatedAt": {
429+
"type": [
430+
"string",
431+
"null"
432+
],
433+
"description": "When this entry was last successfully refreshed (ISO 8601)."
434+
},
435+
"lastRefreshAttemptAt": {
436+
"type": [
437+
"string",
438+
"null"
439+
],
440+
"description": "When a refresh was most recently attempted (ISO 8601)."
441+
},
442+
"lastRefreshError": {
443+
"type": [
444+
"string",
445+
"null"
446+
],
447+
"description": "The last refresh failure message, if any."
448+
},
449+
"stale": {
450+
"type": "boolean",
451+
"description": "Whether we believe this data may be outdated."
452+
},
453+
"modelSelectionHint": {
454+
"type": [
455+
"string",
456+
"null"
457+
],
458+
"description": "Guidance message shown when this provider manages its own model selection externally."
459+
}
460+
},
461+
"required": [
462+
"providerId",
463+
"providerName",
464+
"configured",
465+
"supportsRefresh",
466+
"refreshing",
467+
"models",
468+
"stale"
469+
],
470+
"description": "Provider inventory entry."
471+
},
472+
"ProviderInventoryModelDto": {
473+
"type": "object",
474+
"properties": {
475+
"id": {
476+
"type": "string",
477+
"description": "Model identifier as the provider knows it."
478+
},
479+
"name": {
480+
"type": "string",
481+
"description": "Human-readable display name."
482+
},
483+
"family": {
484+
"type": [
485+
"string",
486+
"null"
487+
],
488+
"description": "Model family for grouping in UI."
489+
},
490+
"contextLimit": {
491+
"type": [
492+
"integer",
493+
"null"
494+
],
495+
"format": "uint",
496+
"minimum": 0,
497+
"description": "Context window size in tokens."
498+
},
499+
"reasoning": {
500+
"type": [
501+
"boolean",
502+
"null"
503+
],
504+
"description": "Whether the model supports reasoning/extended thinking."
505+
},
506+
"recommended": {
507+
"type": "boolean",
508+
"description": "Whether this model should appear in the compact recommended picker.",
509+
"default": false
510+
}
511+
},
512+
"required": [
513+
"id",
514+
"name"
515+
],
516+
"description": "A single model in provider inventory."
517+
},
518+
"RefreshProviderInventoryRequest": {
519+
"type": "object",
520+
"properties": {
521+
"providerIds": {
383522
"type": "array",
384523
"items": {
385524
"type": "string"
386-
}
525+
},
526+
"description": "Which providers to refresh. Empty means all known providers.",
527+
"default": []
528+
}
529+
},
530+
"description": "Trigger a background refresh of provider inventories.",
531+
"x-side": "agent",
532+
"x-method": "_goose/providers/inventory/refresh"
533+
},
534+
"RefreshProviderInventoryResponse": {
535+
"type": "object",
536+
"properties": {
537+
"started": {
538+
"type": "array",
539+
"items": {
540+
"type": "string"
541+
},
542+
"description": "Which providers will be refreshed."
543+
},
544+
"skipped": {
545+
"type": "array",
546+
"items": {
547+
"$ref": "#/$defs/RefreshProviderInventorySkipDto"
548+
},
549+
"description": "Which providers were skipped and why.",
550+
"default": []
387551
}
388552
},
389553
"required": [
390-
"models"
554+
"started"
391555
],
392-
"description": "Provider models response.",
556+
"description": "Refresh acknowledgement.",
393557
"x-side": "agent",
394-
"x-method": "_goose/providers/models"
558+
"x-method": "_goose/providers/inventory/refresh"
559+
},
560+
"RefreshProviderInventorySkipDto": {
561+
"type": "object",
562+
"properties": {
563+
"providerId": {
564+
"type": "string"
565+
},
566+
"reason": {
567+
"$ref": "#/$defs/RefreshProviderInventorySkipReasonDto"
568+
}
569+
},
570+
"required": [
571+
"providerId",
572+
"reason"
573+
]
574+
},
575+
"RefreshProviderInventorySkipReasonDto": {
576+
"type": "string",
577+
"enum": [
578+
"unknown_provider",
579+
"not_configured",
580+
"does_not_support_refresh",
581+
"already_refreshing"
582+
]
395583
},
396584
"ReadConfigRequest": {
397585
"type": "object",
@@ -1035,11 +1223,20 @@
10351223
{
10361224
"allOf": [
10371225
{
1038-
"$ref": "#/$defs/GetProviderModelsRequest"
1226+
"$ref": "#/$defs/GetProviderInventoryRequest"
1227+
}
1228+
],
1229+
"description": "Params for _goose/providers/inventory",
1230+
"title": "GetProviderInventoryRequest"
1231+
},
1232+
{
1233+
"allOf": [
1234+
{
1235+
"$ref": "#/$defs/RefreshProviderInventoryRequest"
10391236
}
10401237
],
1041-
"description": "Params for _goose/providers/models",
1042-
"title": "GetProviderModelsRequest"
1238+
"description": "Params for _goose/providers/inventory/refresh",
1239+
"title": "RefreshProviderInventoryRequest"
10431240
},
10441241
{
10451242
"allOf": [
@@ -1292,10 +1489,18 @@
12921489
{
12931490
"allOf": [
12941491
{
1295-
"$ref": "#/$defs/GetProviderModelsResponse"
1492+
"$ref": "#/$defs/GetProviderInventoryResponse"
1493+
}
1494+
],
1495+
"title": "GetProviderInventoryResponse"
1496+
},
1497+
{
1498+
"allOf": [
1499+
{
1500+
"$ref": "#/$defs/RefreshProviderInventoryResponse"
12961501
}
12971502
],
1298-
"title": "GetProviderModelsResponse"
1503+
"title": "RefreshProviderInventoryResponse"
12991504
},
13001505
{
13011506
"allOf": [

0 commit comments

Comments
 (0)