Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add azure-director #5974

Merged
merged 30 commits into from
Jul 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
a3c5f55
feat: add key-auth
dspo Jul 6, 2023
749b705
feat: key-auth response message
dspo Jul 6, 2023
7070fe9
feat: fech https://github.com/open-telemetry/opentelemetry-proto.git …
dspo Jul 6, 2023
5f75756
feat: remove ai-proxy from erda.yml
dspo Jul 6, 2023
b8f37b5
feat: add http test; add provider info to credential model
dspo Jul 6, 2023
da94db1
fix: typo
dspo Jul 6, 2023
7749f72
feat: update http test
dspo Jul 6, 2023
eb2145b
feat: make accessKeyId secretKeyId length 32
dspo Jul 7, 2023
9dd33e2
feat: app_key_sha256 to audit
dspo Jul 7, 2023
adce286
feat: update .http
dspo Jul 10, 2023
409a164
feat: update ai-proxy migrations
dspo Jul 10, 2023
bbdb892
feat: open /v1/models and /v1/models/{model}
dspo Jul 10, 2023
b1eda01
fix: typo
dspo Jul 10, 2023
85dc1e0
feat: appKey to provider as one to many
dspo Jul 11, 2023
76adeba
feat: sort routes
dspo Jul 11, 2023
92219af
feat: 重构了选择 azure 实例的逻辑, 不再依靠配置, 而是依靠客户端指定或根据 api-key 寻找
dspo Jul 12, 2023
aac57ca
feat: fix route validation
dspo Jul 12, 2023
1e051dd
fix: router.Clone
dspo Jul 12, 2023
3e5efc6
fix: invalid memory in router clone
dspo Jul 12, 2023
a9adfc5
feat: remove match header
dspo Jul 12, 2023
2a7f7ba
feat: fix body-size-limit
dspo Jul 12, 2023
0efe473
feat: add api-key to provider azure default
dspo Jul 12, 2023
61c89d8
feat: use api-version=2023-03-15-preview
dspo Jul 12, 2023
d292efa
feat: add simple auth to ai-proxy admin api
dspo Jul 12, 2023
5d11893
feat: add Authorization to http test
dspo Jul 12, 2023
72b4551
feat: ut
dspo Jul 13, 2023
723cede
feat: add x-request-id to audit
dspo Jul 13, 2023
2ebc6f1
fix: imports
dspo Jul 13, 2023
a2d3b8c
feat: resolve review #pullrequestreview-1527923573
dspo Jul 13, 2023
ba325cf
fix: rename field
dspo Jul 14, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ CREATE TABLE `ai_proxy_filter_audit`
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted_at` DATETIME NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '删除时间, 1970-01-01 00:00:00 表示未删除',

`api_key_sha256` CHAR(64) NOT NULL DEFAULT '' COMMENT '请求使用的 app_key sha256 哈希值',

`username` VARCHAR(128) NOT NULL COMMENT '用户名称, source=dingtalk时, 为钉钉用户名称',
`phone_number` VARCHAR(32) NOT NULL COMMENT '用户手机号码, source=dingtalk时, 为钉钉账号注册手机号',
`job_number` VARCHAR(32) NOT NULL COMMENT '用户工号, source=dingtalk时, 为用户在其组织内的工号',
Expand All @@ -17,11 +19,14 @@ CREATE TABLE `ai_proxy_filter_audit`
`chat_id` VARCHAR(64) NOT NULL COMMENT '钉钉聊天 id',
`source` VARCHAR(128) NOT NULL COMMENT '接入应用: dingtalk, vscode-plugin, jetbrains-plugin ...',
`provider` VARCHAR(128) NOT NULL COMMENT 'AI 能力提供商: openai, azure...',
`provider_instance_id` VARCHAR(512) NOT NULL DEFAULT '' COMMENT 'provider 实例名称',
`model` VARCHAR(128) NOT NULL COMMENT '调用的模型名称: gpt-3.5-turbo, gpt-4-8k, ...',
`operation_id` VARCHAR(128) NOT NULL COMMENT '调用的接口名称, HTTP Method + Path',
`prompt` MEDIUMTEXT NOT NULL COMMENT '提示语',
`completion` LONGTEXT NOT NULL COMMENT 'AI 回复多个 choices 中的一个',
`metadata` LONGTEXT NOT NULL COMMENT '客户端要审计的其他信息',

`x_request_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT 'http 请求中的 X-Request-Id',
`request_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '请求到达时间',
`response_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '响应到达时间',
`request_content_type` VARCHAR(32) NOT NULL COMMENT '请求使用的 Content-Type',
Expand All @@ -37,7 +42,7 @@ CREATE TABLE `ai_proxy_filter_audit`
INDEX `idx_dingtalk_staff_id` (`dingtalk_staff_id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COMMENT 'AI 插件之审计';
COMMENT 'ai-proxy 审计表';

CREATE TABLE `ai_proxy_sessions`
(
Expand Down
24 changes: 24 additions & 0 deletions .erda/ai-proxy/migrations/ai-proxy/20230706-credentials.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
CREATE TABLE `ai_proxy_credentials`
(
`id` CHAR(36) NOT NULL COMMENT 'primary key',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted_at` DATETIME NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '删除时间, 1970-01-01 00:00:00 表示未删除',

`access_key_id` CHAR(32) NOT NULL COMMENT '平台接入 AI 服务的 AK',
`secret_key_id` CHAR(32) NOT NULL COMMENT '平台接入 AI 服务的 SK',
`name` VARCHAR(64) NOT NULL COMMENT '凭证名称',
`platform` VARCHAR(128) NOT NULL COMMENT '接入 AI 服务的平台',
`description` VARCHAR(512) NOT NULL COMMENT '凭证描述',
`enabled` BOOLEAN NOT NULL DEFAULT true COMMENT '是否启用该凭证',
`expired_at` DATETIME NOT NULL DEFAULT '2099-01-01 00:00:00' COMMENT '凭证过期时间',

`provider` VARCHAR(128) NOT NULL DEFAULT '' COMMENT 'AI 服务 Provider 名称',
`provider_instance_id` VARCHAR(512) NOT NULL DEFAULT '' COMMENT 'AI 服务 Provider 实例 id',
PRIMARY KEY (`id`),
INDEX `idx_access_key_id` (`access_key_id`),
INDEX `idx_name` (`name`),
INDEX `idx_platform` (`platform`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COMMENT 'ai-proxy 凭证';
221 changes: 221 additions & 0 deletions api/proto-go/go.sum

Large diffs are not rendered by default.

94 changes: 94 additions & 0 deletions api/proto/apps/aiproxy/credential.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
syntax = "proto3";

package erda.apps.aiproxy;
option go_package = "github.com/erda-project/erda-proto-go/apps/aiproxy/pb";

import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";
import "common/openapi.proto";
import "common/http.proto";

service Credentials {
option(erda.common.openapi_service) = {
service: "ai-proxy",
auth: {
check_login: true,
check_token: true,
}
};

rpc CreateCredential(Credential) returns (Credential) {
option(google.api.http) = {
post: "/api/ai-proxy/credentials"
};
option(erda.common.openapi) = {
path: "/api/ai-proxy/credentials"
};
}

rpc DeleteCredential(DeleteCredentialReq) returns (common.VoidResponse) {
option(google.api.http) = {
delete: "/api/ai-proxy/credentials/{accessKeyId}"
};
option(erda.common.openapi) = {
path: "/api/ai-proxy/credentials/{accessKeyId}"
};
}

rpc UpdateCredential(Credential) returns (Credential) {
option(google.api.http) = {
put: "/api/ai-proxy/credentials/{accessKeyId}"
};
option(erda.common.openapi) = {
path: "/api/ai-proxy/credentials/{accessKeyId}"
};
}

rpc ListCredentials(Credential) returns (ListCredentialsRespData) {
option(google.api.http) = {
get: "/api/ai-proxy/credentials"
};
option(erda.common.openapi) = {
path: "/api/ai-proxy/credentials"
};
}

rpc GetCredential(GetCredentialReq) returns (Credential) {
option(google.api.http) = {
get: "/api/ai-proxy/credentials/{accessKeyId}"
};
option(erda.common.openapi) = {
path: "/api/ai-proxy/credentials/{accessKeyId}"
};
}
}

message Credential {
string accessKeyId = 1;
string secretKeyId = 2;
string name = 3;
string platform = 4;
string description = 5;
bool enabled = 6;
string providerName = 7;
string providerInstance = 8;
}

message DeleteCredentialReq {
string accessKeyId = 1;
}

message UpdateCredentialReq {
string accessKeyId = 1;
string name = 2;
string description = 5;
}

message ListCredentialsRespData {
uint32 total = 1;
repeated Credential list = 2;
}

message GetCredentialReq {
string accessKeyId = 1;
}
80 changes: 80 additions & 0 deletions api/proto/apps/aiproxy/provider.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
syntax = "proto3";

package erda.apps.aiproxy;
option go_package = "github.com/erda-project/erda-proto-go/apps/aiproxy/pb";

import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";
import "common/openapi.proto";
import "common/http.proto";

service AIProvider {
option(erda.common.openapi_service) = {
service: "ai-proxy",
auth: {
check_login: true,
check_token: true,
}
};

rpc CreateProvider(Provider) returns (Provider) {
option(google.api.http) = {
post: "/api/ai-proxy/providers"
};
option(erda.common.openapi) = {
path: "/api/ai-proxy/providers"
};
}

rpc DeleteProvider(Provider) returns (common.VoidResponse) {
option(google.api.http) = {
delete: "/api/ai-proxy/providers/{name}/instances/{instanceId}"
};
option(erda.common.openapi) = {
path: "/api/ai-proxy/providers/{name}/instances/{instanceId}"
};
}

rpc UpdateProvider(Provider) returns (Provider) {
option(google.api.http) = {
put: "/api/ai-proxy/providers/{name}/instances/{instanceId}"
};
option(erda.common.openapi) = {
path: "/api/ai-proxy/providers/{name}/instances/{instanceId}"
};
}

rpc ListProviders(Provider) returns (ListProvidersRespData) {
option(google.api.http) = {
get: "/api/ai-proxy/providers"
};
option(erda.common.openapi) = {
path: "/api/ai-proxy/providers"
};
}

rpc GetProvider(Provider) returns (Provider) {
option(google.api.http) = {
get: "/api/ai-proxy/providers/{name}/instances/{instanceId}"
};
option(erda.common.openapi) = {
path: "/api/ai-proxy/providers/{name}/instances/{instanceId}"
};
}
}

message Provider {
string name = 1;
string instanceId = 2;
string host = 3;
string scheme = 4;
string description = 5;
string docSite = 6;
string appKey = 7;
string metadata = 8;
}

message ListProvidersRespData {
uint32 total = 1;
repeated Provider list = 2;
}
22 changes: 13 additions & 9 deletions cmd/ai-proxy/conf/providers.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,24 +10,28 @@ providers:
metadata: {}

- name: azure
instanceId: default
host: codeai.openai.azure.com
instanceId: deployment_name=gpt-35-turbo-0301&resource_name=terminus3
host: terminus3.openai.azure.com
scheme: https
description: azure 提供的 ai 能力
docSite: https://learn.microsoft.com/en-us/azure/cognitive-services/openai/reference
appKey: ${ env.OPENAI_API_KEY }
dspo marked this conversation as resolved.
Show resolved Hide resolved
metadata:
RESOURCE_NAME: "codeai"
DEVELOPMENT_NAME: "gpt-35-turbo-0301"
RESOURCE_NAME: terminus3"
DEVELOPMENT_NAME: gpt-35-turbo-0301
API_VERSION: 2023-03-15-preview

- name: azure
instanceId: terminus3
host: terminus3.openai.azure.com
instanceId: deployment_name=gpt-35-turbo-16k&resource_name=terminus2
host: terminus2.openai.azure.com
scheme: https
description: azure 提供的 ai 能力
description: azure terminus2 实例
docSite: https://learn.microsoft.com/en-us/azure/cognitive-services/openai/reference
appKey: ${ env.TERMINUS2_OPENAI_API_KEY }
metadata:
RESOURCE_NAME: "terminus3"
DEVELOPMENT_NAME: "gpt-35-turbo-0301"
RESOURCE_NAME: terminus2
DEVELOPMENT_NAME: gpt-35-turbo-16k
API_VERSION: 2023-03-15-preview

- name: test-server
instanceId: default
Expand Down
Loading
Loading