@inkeep/agents-manage-ui 0.8.2 → 0.8.3

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 (147) hide show
  1. package/.next/standalone/agents-manage-ui/.next/BUILD_ID +1 -1
  2. package/.next/standalone/agents-manage-ui/.next/app-build-manifest.json +59 -59
  3. package/.next/standalone/agents-manage-ui/.next/app-path-routes-manifest.json +3 -3
  4. package/.next/standalone/agents-manage-ui/.next/build-manifest.json +2 -2
  5. package/.next/standalone/agents-manage-ui/.next/prerender-manifest.json +3 -3
  6. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/page.js +1 -1
  7. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/page_client-reference-manifest.js +1 -1
  8. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/api-keys/page.js +3 -3
  9. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/api-keys/page_client-reference-manifest.js +1 -1
  10. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/[artifactComponentId]/page.js +2 -2
  11. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/[artifactComponentId]/page.js.nft.json +1 -1
  12. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/[artifactComponentId]/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/new/page.js +2 -2
  14. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/new/page.js.nft.json +1 -1
  15. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/new/page_client-reference-manifest.js +1 -1
  16. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/page.js +2 -2
  17. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifact-components/page_client-reference-manifest.js +1 -1
  18. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page.js +2 -2
  19. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page.js.nft.json +1 -1
  20. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page_client-reference-manifest.js +1 -1
  21. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page.js +2 -2
  22. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page.js.nft.json +1 -1
  23. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page_client-reference-manifest.js +1 -1
  24. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/page.js +1 -1
  25. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/page_client-reference-manifest.js +1 -1
  26. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page.js +2 -2
  27. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page.js.nft.json +1 -1
  28. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page_client-reference-manifest.js +1 -1
  29. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page.js +2 -2
  30. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page.js.nft.json +1 -1
  31. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page_client-reference-manifest.js +1 -1
  32. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/page.js +2 -2
  33. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/page_client-reference-manifest.js +1 -1
  34. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/[dataComponentId]/page.js +2 -2
  35. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/[dataComponentId]/page.js.nft.json +1 -1
  36. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/[dataComponentId]/page_client-reference-manifest.js +1 -1
  37. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/new/page.js +2 -2
  38. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/new/page.js.nft.json +1 -1
  39. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/new/page_client-reference-manifest.js +1 -1
  40. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/page.js +1 -1
  41. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/data-components/page_client-reference-manifest.js +1 -1
  42. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/[graphId]/page.js +2 -2
  43. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/[graphId]/page.js.nft.json +1 -1
  44. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/[graphId]/page_client-reference-manifest.js +1 -1
  45. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/new/page.js +2 -2
  46. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/new/page.js.nft.json +1 -1
  47. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/new/page_client-reference-manifest.js +1 -1
  48. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/page.js +2 -2
  49. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/page_client-reference-manifest.js +1 -1
  50. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page.js +2 -2
  51. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page.js.nft.json +1 -1
  52. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page_client-reference-manifest.js +1 -1
  53. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page.js +2 -2
  54. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page_client-reference-manifest.js +1 -1
  55. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page.js +2 -2
  56. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page.js.nft.json +1 -1
  57. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page_client-reference-manifest.js +1 -1
  58. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/page.js +2 -2
  59. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/page_client-reference-manifest.js +1 -1
  60. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/page.js +2 -2
  61. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/page_client-reference-manifest.js +1 -1
  62. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/settings/page.js +2 -2
  63. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/settings/page_client-reference-manifest.js +1 -1
  64. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page.js +2 -2
  65. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page.js.nft.json +1 -1
  66. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page_client-reference-manifest.js +1 -1
  67. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page.js +2 -2
  68. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page.js.nft.json +1 -1
  69. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page_client-reference-manifest.js +1 -1
  70. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page.js +3 -3
  71. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page.js.nft.json +1 -1
  72. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page_client-reference-manifest.js +1 -1
  73. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/page.js +2 -2
  74. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/page_client-reference-manifest.js +1 -1
  75. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found/page.js +1 -1
  76. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  77. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found.html +1 -1
  78. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found.rsc +8 -8
  79. package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
  80. package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/route_client-reference-manifest.js +1 -1
  81. package/.next/standalone/agents-manage-ui/.next/server/app/page.js +2 -2
  82. package/.next/standalone/agents-manage-ui/.next/server/app/page_client-reference-manifest.js +1 -1
  83. package/.next/standalone/agents-manage-ui/.next/server/app-paths-manifest.json +3 -3
  84. package/.next/standalone/agents-manage-ui/.next/server/chunks/2124.js +3 -3
  85. package/.next/standalone/agents-manage-ui/.next/server/chunks/2411.js +2 -2
  86. package/.next/standalone/agents-manage-ui/.next/server/chunks/2949.js +1 -1
  87. package/.next/standalone/agents-manage-ui/.next/server/chunks/3518.js +1 -0
  88. package/.next/standalone/agents-manage-ui/.next/server/chunks/3547.js +1 -1
  89. package/.next/standalone/agents-manage-ui/.next/server/chunks/{640.js → 36.js} +1 -1
  90. package/.next/standalone/agents-manage-ui/.next/server/chunks/442.js +1 -0
  91. package/.next/standalone/agents-manage-ui/.next/server/chunks/6028.js +1 -0
  92. package/.next/standalone/agents-manage-ui/.next/server/chunks/71.js +1 -1
  93. package/.next/standalone/agents-manage-ui/.next/server/chunks/782.js +1 -0
  94. package/.next/standalone/agents-manage-ui/.next/server/chunks/8196.js +1 -0
  95. package/.next/standalone/agents-manage-ui/.next/server/chunks/8449.js +4 -4
  96. package/.next/standalone/agents-manage-ui/.next/server/pages/404.html +1 -1
  97. package/.next/standalone/agents-manage-ui/.next/server/pages/500.html +1 -1
  98. package/.next/standalone/agents-manage-ui/.next/server/server-reference-manifest.js +1 -1
  99. package/.next/standalone/agents-manage-ui/.next/server/server-reference-manifest.json +1 -1
  100. package/.next/standalone/agents-manage-ui/.next/static/chunks/{8158-8615ec07e7ee270b.js → 2206-9ff3c0c8319b8686.js} +1 -1
  101. package/.next/standalone/agents-manage-ui/.next/static/chunks/7167-0fa67567fae3fade.js +1 -0
  102. package/.next/standalone/agents-manage-ui/.next/static/chunks/{7820-5628646ae2b0f1f6.js → 7767-02066bb80b94f34a.js} +1 -1
  103. package/.next/standalone/agents-manage-ui/.next/static/chunks/8356-d72db466159ee410.js +1 -0
  104. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/page-49bddefea3fe5403.js +1 -0
  105. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/[artifactComponentId]/{page-a902479408487201.js → page-e6339bd5c52abe5c.js} +1 -1
  106. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/new/{page-a902479408487201.js → page-e6339bd5c52abe5c.js} +1 -1
  107. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/page-5dfdded2864cf26f.js +1 -0
  108. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page-5a352e5bb0f0d362.js +1 -0
  109. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-86f2bdd15f326447.js +1 -0
  110. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/{page-cda60ce5b7814494.js → page-6a0d941539881746.js} +1 -1
  111. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/page-160b2773bf3ada68.js +1 -0
  112. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/data-components/[dataComponentId]/{page-6c3189c5a6dcff34.js → page-2b552c02b2f25275.js} +1 -1
  113. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/data-components/new/{page-6c3189c5a6dcff34.js → page-2b552c02b2f25275.js} +1 -1
  114. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/data-components/{page-24e1074f8fa32f75.js → page-1da2122637de9964.js} +1 -1
  115. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/{page-e1d1660ac8ad81ed.js → page-45c9b732f07151fe.js} +1 -1
  116. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/{page-7e4097fbe767b09f.js → page-fb9458614e107dea.js} +1 -1
  117. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/new/{page-16c2d4ef3b42b6ca.js → page-8a0480ac85e4062a.js} +1 -1
  118. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/page-2f95ce875ceb5abc.js +1 -0
  119. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/settings/{page-92fd96a32dea362c.js → page-ae696cda7c8b55c2.js} +1 -1
  120. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-5284982e6a917cc7.js +1 -0
  121. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/page-47c9f4e642b70015.js +1 -0
  122. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/layout-54d17d92420d4b7d.js +1 -0
  123. package/.next/standalone/agents-manage-ui/package.json +1 -1
  124. package/.next/standalone/packages/agents-core/package.json +1 -1
  125. package/package.json +4 -4
  126. package/src/components/graph/sidepane/nodes/model-selector.tsx +229 -216
  127. package/src/components/projects/form/form-configuration.ts +1 -4
  128. package/src/components/projects/form/project-form.tsx +35 -3
  129. package/src/components/projects/form/project-models-section.tsx +52 -49
  130. package/.next/standalone/agents-manage-ui/.next/server/chunks/295.js +0 -1
  131. package/.next/standalone/agents-manage-ui/.next/server/chunks/4446.js +0 -1
  132. package/.next/standalone/agents-manage-ui/.next/server/chunks/5117.js +0 -1
  133. package/.next/standalone/agents-manage-ui/.next/server/chunks/5330.js +0 -1
  134. package/.next/standalone/agents-manage-ui/.next/server/chunks/83.js +0 -1
  135. package/.next/standalone/agents-manage-ui/.next/static/chunks/4130-ab98ce21ff35281d.js +0 -1
  136. package/.next/standalone/agents-manage-ui/.next/static/chunks/7167-4fa838f0f7b317b3.js +0 -1
  137. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/page-02c5c9c88d7ab2b3.js +0 -1
  138. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifact-components/page-bbd70d3db34aff36.js +0 -1
  139. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page-c6e9e91ec8fc537d.js +0 -1
  140. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-dd9b869214273592.js +0 -1
  141. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/page-3a4414df3241627d.js +0 -1
  142. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/page-e9de32a9a6b2e2de.js +0 -1
  143. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-1c8856f3de066bd4.js +0 -1
  144. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/page-babbd13ec2c08665.js +0 -1
  145. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/layout-a26e8df8afd6fc35.js +0 -1
  146. /package/.next/standalone/agents-manage-ui/.next/static/{t339BszWE91q9Cp5Tl1vT → YDKeLLeMD2zT8EUlv1AJ9}/_buildManifest.js +0 -0
  147. /package/.next/standalone/agents-manage-ui/.next/static/{t339BszWE91q9Cp5Tl1vT → YDKeLLeMD2zT8EUlv1AJ9}/_ssgManifest.js +0 -0
@@ -73,237 +73,250 @@ export function ModelSelector({
73
73
 
74
74
  return (
75
75
  <div className="space-y-2">
76
- <Label>
77
- {label}
78
- {tooltip && (
79
- <TooltipProvider>
80
- <Tooltip>
81
- <TooltipTrigger asChild>
82
- <Info className="w-3 h-3 text-muted-foreground" />
83
- </TooltipTrigger>
84
- <TooltipContent>{tooltip}</TooltipContent>
85
- </Tooltip>
86
- </TooltipProvider>
87
- )}
88
- {isRequired && <span className="text-red-500">*</span>}
89
- </Label>
76
+ {label && (
77
+ <Label>
78
+ {label}
79
+ {tooltip && (
80
+ <TooltipProvider>
81
+ <Tooltip>
82
+ <TooltipTrigger asChild>
83
+ <Info className="w-3 h-3 text-muted-foreground" />
84
+ </TooltipTrigger>
85
+ <TooltipContent>{tooltip}</TooltipContent>
86
+ </Tooltip>
87
+ </TooltipProvider>
88
+ )}
89
+ {isRequired && <span className="text-red-500">*</span>}
90
+ </Label>
91
+ )}
90
92
  <div className="relative">
91
- <div className="flex w-full shadow-xs rounded-md">
92
- <Popover open={open} onOpenChange={setOpen}>
93
- <PopoverTrigger asChild>
94
- <Button
95
- variant="outline"
96
- role="combobox"
97
- aria-expanded={open}
98
- className={cn(
99
- 'justify-between bg-background dark:bg-background flex-1 text-foreground shadow-none truncate',
100
- selectedModel && canClear ? 'rounded-r-none border-r-0' : 'rounded-r-md'
101
- )}
93
+ <div className="flex w-full shadow-xs rounded-md">
94
+ <Popover open={open} onOpenChange={setOpen}>
95
+ <PopoverTrigger asChild>
96
+ <Button
97
+ variant="outline"
98
+ role="combobox"
99
+ aria-expanded={open}
100
+ className={cn(
101
+ 'justify-between bg-background dark:bg-background flex-1 text-foreground shadow-none truncate',
102
+ selectedModel && canClear ? 'rounded-r-none border-r-0' : 'rounded-r-md'
103
+ )}
104
+ >
105
+ {selectedModel ? (
106
+ <div className="truncate">
107
+ {'prefix' in selectedModel && selectedModel.prefix && (
108
+ <span className="text-gray-400">{selectedModel.prefix}</span>
109
+ )}
110
+ {selectedModel.label}
111
+ </div>
112
+ ) : inheritedModel ? (
113
+ <div className="truncate text-muted-foreground">
114
+ <span className="italic">{inheritedModel.label}</span>
115
+ <span className="text-xs ml-1">(inherited)</span>
116
+ </div>
117
+ ) : (
118
+ <div className="text-muted-foreground">{placeholder}</div>
119
+ )}
120
+ <ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
121
+ </Button>
122
+ </PopoverTrigger>
123
+ <PopoverContent
124
+ className="p-0 w-[var(--radix-popover-trigger-width)] transition-all duration-200 ease-in-out"
125
+ align="start"
126
+ side="bottom"
127
+ onWheel={(e) => {
128
+ e.stopPropagation(); // to make scroll work inside dialog https://github.com/radix-ui/primitives/issues/1159
129
+ }}
130
+ onTouchMove={(e) => {
131
+ e.stopPropagation(); // to make scroll work inside dialog https://github.com/radix-ui/primitives/issues/1159
132
+ }}
102
133
  >
103
- {selectedModel ? (
104
- <div className="truncate">
105
- {'prefix' in selectedModel && selectedModel.prefix && (
106
- <span className="text-gray-400">{selectedModel.prefix}</span>
107
- )}
108
- {selectedModel.label}
109
- </div>
110
- ) : inheritedModel ? (
111
- <div className="truncate text-muted-foreground">
112
- <span className="italic">{inheritedModel.label}</span>
113
- <span className="text-xs ml-1">(inherited)</span>
114
- </div>
115
- ) : (
116
- <div className="text-muted-foreground">{placeholder}</div>
117
- )}
118
- <ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
119
- </Button>
120
- </PopoverTrigger>
121
- <PopoverContent
122
- className="p-0 w-[var(--radix-popover-trigger-width)] transition-all duration-200 ease-in-out"
123
- align="start"
124
- side="bottom"
125
- onWheel={(e) => {
126
- e.stopPropagation(); // to make scroll work inside dialog https://github.com/radix-ui/primitives/issues/1159
127
- }}
128
- onTouchMove={(e) => {
129
- e.stopPropagation(); // to make scroll work inside dialog https://github.com/radix-ui/primitives/issues/1159
130
- }}
131
- >
132
- <Command>
133
- <CommandInput placeholder="Search models or type custom model ID..." />
134
- <CommandList className="max-h-64">
135
- <CommandEmpty>
136
- {(() => {
137
- // Only access document on the client side
138
- if (typeof document !== 'undefined') {
139
- const input = document.querySelector('[cmdk-input]') as HTMLInputElement;
140
- const searchValue = input?.value || '';
134
+ <Command>
135
+ <CommandInput placeholder="Search models or type custom model ID..." />
136
+ <CommandList className="max-h-64">
137
+ <CommandEmpty>
138
+ {(() => {
139
+ // Only access document on the client side
140
+ if (typeof document !== 'undefined') {
141
+ const input = document.querySelector('[cmdk-input]') as HTMLInputElement;
142
+ const searchValue = input?.value || '';
141
143
 
142
- if (searchValue.trim()) {
143
- return (
144
- <CommandItem
145
- className="flex items-center justify-between cursor-pointer text-foreground"
146
- value={searchValue}
147
- onSelect={() => {
148
- const modelValue = searchValue.trim();
144
+ if (searchValue.trim()) {
145
+ return (
146
+ <CommandItem
147
+ className="flex items-center justify-between cursor-pointer text-foreground"
148
+ value={searchValue}
149
+ onSelect={() => {
150
+ const modelValue = searchValue.trim();
149
151
 
150
- // Auto-add prefixes if they look like they belong to these services
151
- if (modelValue.includes('/') && !modelValue.startsWith('openrouter/') && !modelValue.startsWith('gateway/')) {
152
- // Could be openrouter format, let user decide or add logic here
153
- }
152
+ // Auto-add prefixes if they look like they belong to these services
153
+ if (
154
+ modelValue.includes('/') &&
155
+ !modelValue.startsWith('openrouter/') &&
156
+ !modelValue.startsWith('gateway/')
157
+ ) {
158
+ // Could be openrouter format, let user decide or add logic here
159
+ }
154
160
 
155
- onValueChange?.(modelValue);
156
- setOpen(false);
157
- }}
158
- >
159
- Use "{searchValue}" as custom model
160
- </CommandItem>
161
- );
161
+ onValueChange?.(modelValue);
162
+ setOpen(false);
163
+ }}
164
+ >
165
+ Use "{searchValue}" as custom model
166
+ </CommandItem>
167
+ );
168
+ }
162
169
  }
163
- }
164
170
 
165
- return (
166
- <div className="p-2 text-muted-foreground text-sm">
167
- Type to search models or enter a custom model ID
168
- </div>
169
- );
170
- })()}
171
- </CommandEmpty>
172
- {/* LLM Gateway options */}
173
- <CommandGroup heading="LLM Gateway">
174
- <CommandItem
175
- className="flex items-center justify-between cursor-pointer text-foreground"
176
- value="__openrouter__"
177
- onSelect={() => {
178
- setShowCustomInput('openrouter');
179
- setCustomModelInput('');
171
+ return (
172
+ <div className="p-2 text-muted-foreground text-sm">
173
+ Type to search models or enter a custom model ID
174
+ </div>
175
+ );
176
+ })()}
177
+ </CommandEmpty>
178
+ {/* LLM Gateway options */}
179
+ <CommandGroup heading="LLM Gateway">
180
+ <CommandItem
181
+ className="flex items-center justify-between cursor-pointer text-foreground"
182
+ value="__openrouter__"
183
+ onSelect={() => {
184
+ setShowCustomInput('openrouter');
185
+ setCustomModelInput('');
186
+ }}
187
+ >
188
+ OpenRouter ...
189
+ </CommandItem>
190
+ <CommandItem
191
+ className="flex items-center justify-between cursor-pointer text-foreground"
192
+ value="__gateway__"
193
+ onSelect={() => {
194
+ setShowCustomInput('gateway');
195
+ setCustomModelInput('');
196
+ }}
197
+ >
198
+ Vercel AI Gateway ...
199
+ </CommandItem>
200
+ </CommandGroup>
201
+ {/* Predefined models */}
202
+ {Object.entries(modelOptions).map(([provider, models]) => (
203
+ <CommandGroup key={provider} heading={provider}>
204
+ {models.map((model) => (
205
+ <CommandItem
206
+ key={model.value}
207
+ className="flex items-center justify-between cursor-pointer text-foreground"
208
+ value={model.value}
209
+ onSelect={(currentValue) => {
210
+ onValueChange?.(currentValue === value ? '' : currentValue);
211
+ setOpen(false);
212
+ }}
213
+ >
214
+ {model.label}
215
+ <Check
216
+ className={cn(
217
+ 'ml-2 h-4 w-4',
218
+ value === model.value ? 'opacity-100' : 'opacity-0'
219
+ )}
220
+ />
221
+ </CommandItem>
222
+ ))}
223
+ </CommandGroup>
224
+ ))}
225
+ </CommandList>
226
+ </Command>
227
+ </PopoverContent>
228
+ </Popover>
229
+ {showCustomInput && (
230
+ <div className="absolute top-full left-0 right-0 mt-1 p-3 bg-background border rounded-md shadow-lg z-20">
231
+ <div className="space-y-2">
232
+ <div className="text-sm font-medium">
233
+ {showCustomInput === 'openrouter'
234
+ ? 'OpenRouter Model ID'
235
+ : 'Vercel AI Gateway Model ID'}
236
+ </div>
237
+ <div className="text-xs text-muted-foreground">
238
+ {showCustomInput === 'openrouter'
239
+ ? 'Examples: anthropic/claude-3-5-sonnet, meta-llama/llama-3.1-405b-instruct'
240
+ : 'Examples: openai/gpt-4o, anthropic/claude-3-5-sonnet'}
241
+ </div>
242
+ <div className="flex gap-2">
243
+ <input
244
+ className="flex-1 px-3 py-2 text-sm border rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
245
+ placeholder={
246
+ showCustomInput === 'openrouter'
247
+ ? 'anthropic/claude-3-5-sonnet'
248
+ : 'openai/gpt-4o'
249
+ }
250
+ value={customModelInput}
251
+ onChange={(e) => setCustomModelInput(e.target.value)}
252
+ onKeyDown={(e) => {
253
+ if (e.key === 'Enter' && customModelInput.trim()) {
254
+ const prefix =
255
+ showCustomInput === 'openrouter' ? 'openrouter/' : 'gateway/';
256
+ onValueChange?.(`${prefix}${customModelInput.trim()}`);
257
+ setShowCustomInput(null);
258
+ setCustomModelInput('');
259
+ setOpen(false);
260
+ }
261
+ if (e.key === 'Escape') {
262
+ setShowCustomInput(null);
263
+ setCustomModelInput('');
264
+ }
180
265
  }}
181
- >
182
- OpenRouter ...
183
- </CommandItem>
184
- <CommandItem
185
- className="flex items-center justify-between cursor-pointer text-foreground"
186
- value="__gateway__"
187
- onSelect={() => {
188
- setShowCustomInput('gateway');
189
- setCustomModelInput('');
266
+ />
267
+ <Button
268
+ size="sm"
269
+ onClick={() => {
270
+ if (customModelInput.trim()) {
271
+ const prefix =
272
+ showCustomInput === 'openrouter' ? 'openrouter/' : 'gateway/';
273
+ onValueChange?.(`${prefix}${customModelInput.trim()}`);
274
+ setShowCustomInput(null);
275
+ setCustomModelInput('');
276
+ setOpen(false);
277
+ }
190
278
  }}
279
+ disabled={!customModelInput.trim()}
191
280
  >
192
- Vercel AI Gateway ...
193
- </CommandItem>
194
- </CommandGroup>
195
- {/* Predefined models */}
196
- {Object.entries(modelOptions).map(([provider, models]) => (
197
- <CommandGroup key={provider} heading={provider}>
198
- {models.map((model) => (
199
- <CommandItem
200
- key={model.value}
201
- className="flex items-center justify-between cursor-pointer text-foreground"
202
- value={model.value}
203
- onSelect={(currentValue) => {
204
- onValueChange?.(currentValue === value ? '' : currentValue);
205
- setOpen(false);
206
- }}
207
- >
208
- {model.label}
209
- <Check
210
- className={cn(
211
- 'ml-2 h-4 w-4',
212
- value === model.value ? 'opacity-100' : 'opacity-0'
213
- )}
214
- />
215
- </CommandItem>
216
- ))}
217
- </CommandGroup>
218
- ))}
219
- </CommandList>
220
- </Command>
221
- </PopoverContent>
222
- </Popover>
223
- {showCustomInput && (
224
- <div className="absolute top-full left-0 right-0 mt-1 p-3 bg-background border rounded-md shadow-lg z-20">
225
- <div className="space-y-2">
226
- <div className="text-sm font-medium">
227
- {showCustomInput === 'openrouter' ? 'OpenRouter Model ID' : 'Vercel AI Gateway Model ID'}
228
- </div>
229
- <div className="text-xs text-muted-foreground">
230
- {showCustomInput === 'openrouter'
231
- ? 'Examples: anthropic/claude-3-5-sonnet, meta-llama/llama-3.1-405b-instruct'
232
- : 'Examples: openai/gpt-4o, anthropic/claude-3-5-sonnet'
233
- }
234
- </div>
235
- <div className="flex gap-2">
236
- <input
237
- className="flex-1 px-3 py-2 text-sm border rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
238
- placeholder={showCustomInput === 'openrouter' ? 'anthropic/claude-3-5-sonnet' : 'openai/gpt-4o'}
239
- value={customModelInput}
240
- onChange={(e) => setCustomModelInput(e.target.value)}
241
- onKeyDown={(e) => {
242
- if (e.key === 'Enter' && customModelInput.trim()) {
243
- const prefix = showCustomInput === 'openrouter' ? 'openrouter/' : 'gateway/';
244
- onValueChange?.(`${prefix}${customModelInput.trim()}`);
245
- setShowCustomInput(null);
246
- setCustomModelInput('');
247
- setOpen(false);
248
- }
249
- if (e.key === 'Escape') {
250
- setShowCustomInput(null);
251
- setCustomModelInput('');
252
- }
253
- }}
254
- />
255
- <Button
256
- size="sm"
257
- onClick={() => {
258
- if (customModelInput.trim()) {
259
- const prefix = showCustomInput === 'openrouter' ? 'openrouter/' : 'gateway/';
260
- onValueChange?.(`${prefix}${customModelInput.trim()}`);
281
+ Add
282
+ </Button>
283
+ <Button
284
+ size="sm"
285
+ variant="outline"
286
+ onClick={() => {
261
287
  setShowCustomInput(null);
262
288
  setCustomModelInput('');
263
- setOpen(false);
264
- }
265
- }}
266
- disabled={!customModelInput.trim()}
267
- >
268
- Add
269
- </Button>
270
- <Button
271
- size="sm"
272
- variant="outline"
273
- onClick={() => {
274
- setShowCustomInput(null);
275
- setCustomModelInput('');
276
- }}
277
- >
278
- Cancel
279
- </Button>
289
+ }}
290
+ >
291
+ Cancel
292
+ </Button>
293
+ </div>
280
294
  </div>
281
295
  </div>
282
- </div>
283
- )}
284
- {canClear && (
285
- <div
286
- className={cn(
287
- 'transition-all duration-200 ease-in-out overflow-hidden',
288
- selectedModel && canClear ? 'w-10 opacity-100 scale-100' : 'w-0 opacity-0 scale-95'
289
- )}
290
- >
291
- <Button
292
- variant="outline"
293
- size="icon"
294
- className="rounded-l-none border-l-0 px-2 bg-transparent w-10 transition-all duration-200 ease-in-out text-muted-foreground hover:text-foreground"
295
- onClick={() => {
296
- onValueChange?.('');
297
- }}
298
- aria-label="Clear model selection"
299
- type="button"
300
- disabled={!selectedModel}
296
+ )}
297
+ {canClear && (
298
+ <div
299
+ className={cn(
300
+ 'transition-all duration-200 ease-in-out overflow-hidden',
301
+ selectedModel && canClear ? 'w-10 opacity-100 scale-100' : 'w-0 opacity-0 scale-95'
302
+ )}
301
303
  >
302
- <X className="h-4 w-4" />
303
- </Button>
304
- </div>
305
- )}
306
- </div>
304
+ <Button
305
+ variant="outline"
306
+ size="icon"
307
+ className="rounded-l-none border-l-0 px-2 bg-transparent w-10 transition-all duration-200 ease-in-out text-muted-foreground hover:text-foreground"
308
+ onClick={() => {
309
+ onValueChange?.('');
310
+ }}
311
+ aria-label="Clear model selection"
312
+ type="button"
313
+ disabled={!selectedModel}
314
+ >
315
+ <X className="h-4 w-4" />
316
+ </Button>
317
+ </div>
318
+ )}
319
+ </div>
307
320
  </div>
308
321
  </div>
309
322
  );
@@ -23,8 +23,5 @@ export const defaultValues: ProjectFormData = {
23
23
  providerOptions: undefined,
24
24
  },
25
25
  },
26
- stopWhen: {
27
- transferCountIs: undefined,
28
- stepCountIs: undefined,
29
- },
26
+ stopWhen: undefined,
30
27
  };
@@ -25,27 +25,59 @@ interface ProjectFormProps {
25
25
  }
26
26
 
27
27
  const serializeData = (data: ProjectFormData) => {
28
+ const cleanProviderOptions = (options: any) => {
29
+ // Convert null, empty object, or falsy values to undefined
30
+ if (!options || (typeof options === 'object' && Object.keys(options).length === 0)) {
31
+ return undefined;
32
+ }
33
+ return options;
34
+ };
35
+
36
+ const cleanStopWhen = (stopWhen: any) => {
37
+ // If stopWhen is null, undefined, or empty object, return undefined
38
+ if (!stopWhen || (typeof stopWhen === 'object' && Object.keys(stopWhen).length === 0)) {
39
+ return undefined;
40
+ }
41
+
42
+ // Clean the individual properties - remove null/undefined values
43
+ const cleaned: any = {};
44
+ if (stopWhen.transferCountIs !== null && stopWhen.transferCountIs !== undefined) {
45
+ cleaned.transferCountIs = stopWhen.transferCountIs;
46
+ }
47
+ if (stopWhen.stepCountIs !== null && stopWhen.stepCountIs !== undefined) {
48
+ cleaned.stepCountIs = stopWhen.stepCountIs;
49
+ }
50
+
51
+ // If no valid properties, return undefined
52
+ if (Object.keys(cleaned).length === 0) {
53
+ return undefined;
54
+ }
55
+
56
+ return cleaned;
57
+ };
58
+
28
59
  return {
29
60
  ...data,
30
61
  models: {
31
62
  ...data.models,
32
63
  base: {
33
64
  model: data.models.base.model,
34
- providerOptions: data.models.base.providerOptions,
65
+ providerOptions: cleanProviderOptions(data.models.base.providerOptions),
35
66
  },
36
67
  structuredOutput: data.models?.structuredOutput?.model
37
68
  ? {
38
69
  model: data.models.structuredOutput.model,
39
- providerOptions: data.models.structuredOutput.providerOptions,
70
+ providerOptions: cleanProviderOptions(data.models.structuredOutput.providerOptions),
40
71
  }
41
72
  : undefined,
42
73
  summarizer: data.models?.summarizer?.model
43
74
  ? {
44
75
  model: data.models.summarizer.model,
45
- providerOptions: data.models.summarizer.providerOptions,
76
+ providerOptions: cleanProviderOptions(data.models.summarizer.providerOptions),
46
77
  }
47
78
  : undefined,
48
79
  },
80
+ stopWhen: cleanStopWhen(data.stopWhen),
49
81
  };
50
82
  };
51
83