mirror of
https://github.com/netbirdio/netbird.git
synced 2026-10-27 14:59:09 +01:00
[management,proxy] Add agentgateway integration (#7274)
* [management] Add agentgateway provider catalog entry Allow Agent Network providers to target an operator-supplied agentgateway proxy while stamping trusted NetBird identity headers. Signed-off-by: Daneyon Hansen <daneyon.hansen@solo.io> * [proxy] Allow trusted Agent Network identity headers Permit only the built-in identity injector to replace the two reserved agentgateway attribution headers while keeping them blocked for every other middleware. Signed-off-by: Daneyon Hansen <daneyon.hansen@solo.io> * [management,proxy] Add multi-vendor gateway routing Let one Agent Network route declare multiple parser surfaces while preserving the existing singular vendor wire field. Signed-off-by: Daneyon Hansen <daneyon.hansen@solo.io> * [management] Update router test for model policies Signed-off-by: Daneyon Hansen <daneyon.hansen@solo.io> * [proxy] Cover reserved header policy Signed-off-by: Daneyon Hansen <daneyon.hansen@solo.io> * [management] Add agentgateway model discovery Use agentgateway's OpenAI-compatible models endpoint and omit wildcard patterns until NetBird can authorize and price them consistently. Signed-off-by: Daneyon Hansen <daneyon.hansen@solo.io> --------- Signed-off-by: Daneyon Hansen <daneyon.hansen@solo.io>
This commit is contained in:
@@ -6,9 +6,9 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"go.uber.org/mock/gomock"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"go.uber.org/mock/gomock"
|
||||
|
||||
"github.com/netbirdio/netbird/management/internals/modules/agentnetwork/catalog"
|
||||
"github.com/netbirdio/netbird/management/internals/modules/agentnetwork/types"
|
||||
@@ -497,6 +497,55 @@ func TestSynthesizeServices_IdentityInject_LiteLLM(t *testing.T) {
|
||||
assert.Equal(t, "x-litellm-tags", entry.HeaderPair.TagsHeader)
|
||||
}
|
||||
|
||||
func TestBuildIdentityInjectConfigJSON_Agentgateway(t *testing.T) {
|
||||
provider := &types.Provider{
|
||||
ID: "prov-agentgateway",
|
||||
ProviderID: "agentgateway",
|
||||
}
|
||||
|
||||
raw, err := buildIdentityInjectConfigJSON(
|
||||
[]*types.Provider{provider},
|
||||
map[string][]string{provider.ID: []string{"grp-eng"}},
|
||||
)
|
||||
require.NoError(t, err)
|
||||
|
||||
var cfg identityInjectConfig
|
||||
require.NoError(t, json.Unmarshal(raw, &cfg))
|
||||
require.Len(t, cfg.Providers, 1)
|
||||
|
||||
rule := cfg.Providers[0]
|
||||
assert.Equal(t, provider.ID, rule.ProviderID)
|
||||
require.NotNil(t, rule.HeaderPair)
|
||||
assert.Nil(t, rule.JSONMetadata)
|
||||
assert.Equal(t, "x-netbird-user-id", rule.HeaderPair.EndUserIDHeader)
|
||||
assert.Equal(t, "x-netbird-groups", rule.HeaderPair.TagsHeader)
|
||||
assert.False(t, rule.HeaderPair.EndUserIDInBody)
|
||||
assert.False(t, rule.HeaderPair.TagsInBody)
|
||||
}
|
||||
|
||||
func TestBuildRouterConfigJSON_AgentgatewayVendors(t *testing.T) {
|
||||
provider := &types.Provider{
|
||||
ID: "prov-agentgateway",
|
||||
ProviderID: "agentgateway",
|
||||
UpstreamURL: "https://gateway.example.com",
|
||||
APIKey: "virtual-key",
|
||||
}
|
||||
|
||||
raw, err := buildRouterConfigJSON(
|
||||
[]*types.Provider{provider},
|
||||
map[string][]string{provider.ID: {"grp-eng"}},
|
||||
nil,
|
||||
)
|
||||
require.NoError(t, err)
|
||||
|
||||
var cfg routerConfig
|
||||
require.NoError(t, json.Unmarshal(raw, &cfg))
|
||||
require.Len(t, cfg.Providers, 1)
|
||||
assert.Empty(t, cfg.Providers[0].Vendor,
|
||||
"the singular vendor remains empty for a multi-surface gateway")
|
||||
assert.Equal(t, []string{"openai", "anthropic"}, cfg.Providers[0].Vendors)
|
||||
}
|
||||
|
||||
// TestSynthesizeServices_IdentityInject_Bifrost_OperatorOverrides
|
||||
// covers the customizable HeaderPair contract. The Bifrost catalog
|
||||
// entry sets HeaderPair.Customizable=true with x-bf-dim-* defaults
|
||||
|
||||
Reference in New Issue
Block a user