feat(copilot): managed profile testing and openaiCompatible provider support

- add native openaiCompatible provider type with flat baseUrl/apiKey/dialect
  config fields and declared per-model capabilities
- add admin-only probeManagedCopilotProfile GraphQL mutation that dispatches
  real probe requests against server-managed copilot profiles, reusing the
  BYOK probe engine with an AllowPrivate egress policy for self-hosted
  endpoints (Vertex profiles rejected; use workspace BYOK instead)
- expose providers.profiles app config descriptor to the admin console
- add 'AI Providers' settings group with JSON editor and per-profile Test
  action that probes declared capabilities and reports verified/failed
  status per model and operation
This commit is contained in:
2026-08-26 09:51:52 +07:00
parent ff599ac7f1
commit 177150086f
24 changed files with 1309 additions and 53 deletions

View File

@@ -1467,6 +1467,237 @@
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "boolean",
"default": false
},
"providers.profiles": {
"type": "array",
"description": "The profile list for copilot providers.\n@default []",
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"CopilotManagedCapabilityToken": {
"enum": [
"chat",
"tools",
"vision",
"structured",
"embedding",
"rerank",
"image"
],
"type": "string"
},
"CopilotManagedModelConfigFile": {
"anyOf": [
{
"type": "string"
},
{
"properties": {
"capabilities": {
"default": [],
"items": {
"$ref": "#/definitions/CopilotManagedCapabilityToken"
},
"type": "array"
},
"enabled": {
"default": false,
"type": "boolean"
},
"id": {
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
}
]
},
"CopilotManagedProfileConfigFile": {
"properties": {
"apiKey": {
"default": null,
"type": [
"string",
"null"
]
},
"baseUrl": {
"default": null,
"type": [
"string",
"null"
]
},
"config": {
"additionalProperties": true,
"default": {},
"description": "Legacy nested form. New configs use the flat baseUrl/apiKey/dialect fields.",
"type": "object"
},
"dialect": {
"default": null,
"type": [
"string",
"null"
]
},
"displayName": {
"type": [
"string",
"null"
]
},
"enabled": {
"default": true,
"type": "boolean"
},
"id": {
"type": "string"
},
"middleware": {
"anyOf": [
{
"$ref": "#/definitions/CopilotProviderMiddlewareConfigFile"
},
{
"type": "null"
}
]
},
"models": {
"items": {
"$ref": "#/definitions/CopilotManagedModelConfigFile"
},
"type": [
"array",
"null"
]
},
"priority": {
"format": "double",
"type": [
"number",
"null"
]
},
"type": {
"$ref": "#/definitions/CopilotManagedProvider"
}
},
"required": [
"id",
"type"
],
"type": "object"
},
"CopilotManagedProvider": {
"enum": [
"anthropic",
"anthropicVertex",
"cloudflareWorkersAi",
"fal",
"gemini",
"geminiVertex",
"openai",
"openaiCompatible"
],
"type": "string"
},
"CopilotNodeMiddlewareConfigFile": {
"properties": {
"text": {
"items": {
"$ref": "#/definitions/CopilotNodeTextMiddleware"
},
"type": [
"array",
"null"
]
}
},
"type": "object"
},
"CopilotNodeTextMiddleware": {
"enum": [
"citation_footnote",
"callout",
"thinking_format"
],
"type": "string"
},
"CopilotProviderMiddlewareConfigFile": {
"properties": {
"node": {
"anyOf": [
{
"$ref": "#/definitions/CopilotNodeMiddlewareConfigFile"
},
{
"type": "null"
}
]
},
"rust": {
"anyOf": [
{
"$ref": "#/definitions/CopilotRustMiddlewareConfigFile"
},
{
"type": "null"
}
]
}
},
"type": "object"
},
"CopilotRustMiddlewareConfigFile": {
"properties": {
"request": {
"items": {
"$ref": "#/definitions/CopilotRustRequestMiddleware"
},
"type": [
"array",
"null"
]
},
"stream": {
"items": {
"$ref": "#/definitions/CopilotRustStreamMiddleware"
},
"type": [
"array",
"null"
]
}
},
"type": "object"
},
"CopilotRustRequestMiddleware": {
"enum": [
"normalize_messages",
"clamp_max_tokens",
"tool_schema_rewrite",
"openai_request_compat",
"omit_tool_choice"
],
"type": "string"
},
"CopilotRustStreamMiddleware": {
"enum": [
"stream_event_normalize",
"citation_indexing"
],
"type": "string"
}
},
"items": {
"$ref": "#/definitions/CopilotManagedProfileConfigFile"
},
"title": "Array_of_CopilotManagedProfileConfigFile",
"default": []
}
}
},