init ai api key

This commit is contained in:
xie7654
2025-07-10 15:32:00 +08:00
parent bf07ff5744
commit 65bdda6377
26 changed files with 1825 additions and 6 deletions

0
backend/ai/__init__.py Normal file
View File

3
backend/ai/admin.py Normal file
View File

@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

6
backend/ai/apps.py Normal file
View File

@@ -0,0 +1,6 @@
from django.apps import AppConfig
class AiConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'ai'

21
backend/ai/choices.py Normal file
View File

@@ -0,0 +1,21 @@
from django.db import models
class PlatformChoices(models.TextChoices):
AZURE_OPENAI = 'AzureOpenAI', 'OpenAI 微软'
OPENAI = 'OpenAI', 'OpenAI'
OLLAMA = 'Ollama', 'Ollama'
YIYAN = 'YiYan', '文心一言'
XINGHUO = 'XingHuo', '讯飞星火'
TONGYI = 'TongYi', '通义千问'
STABLE_DIFFUSION = 'StableDiffusion', 'StableDiffusion'
MIDJOURNEY = 'Midjourney', 'Midjourney'
SUNO = 'Suno', 'Suno'
DEEPSEEK = 'DeepSeek', 'DeepSeek'
DOUBAO = 'DouBao', '字节豆包'
HUNYUAN = 'HunYuan', '腾讯混元'
SILICON_FLOW = 'SiliconFlow', '硅基流动'
ZHIPU = 'ZhiPu', '智谱'
MINIMAX = 'MiniMax', 'MiniMax'
MOONSHOT = 'Moonshot', '月之暗灭'
BAICHUAN = 'BaiChuan', '百川智能'

View File

@@ -0,0 +1,214 @@
# Generated by Django 5.2.1 on 2025-07-10 03:03
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = []
operations = [
migrations.CreateModel(
name="AIApiKey",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"remark",
models.CharField(
blank=True,
db_comment="备注",
help_text="备注",
max_length=256,
null=True,
),
),
(
"creator",
models.CharField(
blank=True,
db_comment="创建人",
help_text="创建人",
max_length=64,
null=True,
),
),
(
"modifier",
models.CharField(
blank=True,
db_comment="修改人",
help_text="修改人",
max_length=64,
null=True,
),
),
(
"update_time",
models.DateTimeField(
auto_now=True,
db_comment="修改时间",
help_text="修改时间",
null=True,
),
),
(
"create_time",
models.DateTimeField(
auto_now_add=True,
db_comment="创建时间",
help_text="创建时间",
null=True,
),
),
(
"is_deleted",
models.BooleanField(db_comment="是否软删除", default=False),
),
("name", models.CharField(db_comment="名称", max_length=255)),
("platform", models.CharField(db_comment="平台", max_length=255)),
("api_key", models.CharField(db_comment="密钥", max_length=255)),
(
"url",
models.CharField(
blank=True,
db_comment="自定义 API 地址",
max_length=255,
null=True,
),
),
(
"status",
models.SmallIntegerField(
choices=[(0, "禁用"), (1, "启用")],
db_comment="状态",
default=0,
verbose_name="状态",
),
),
],
options={
"verbose_name": "AI API 密钥",
"verbose_name_plural": "AI API 密钥",
"db_table": "ai_api_key",
},
),
migrations.CreateModel(
name="AIModel",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"remark",
models.CharField(
blank=True,
db_comment="备注",
help_text="备注",
max_length=256,
null=True,
),
),
(
"creator",
models.CharField(
blank=True,
db_comment="创建人",
help_text="创建人",
max_length=64,
null=True,
),
),
(
"modifier",
models.CharField(
blank=True,
db_comment="修改人",
help_text="修改人",
max_length=64,
null=True,
),
),
(
"update_time",
models.DateTimeField(
auto_now=True,
db_comment="修改时间",
help_text="修改时间",
null=True,
),
),
(
"create_time",
models.DateTimeField(
auto_now_add=True,
db_comment="创建时间",
help_text="创建时间",
null=True,
),
),
(
"is_deleted",
models.BooleanField(db_comment="是否软删除", default=False),
),
("name", models.CharField(db_comment="模型名字", max_length=64)),
("sort", models.IntegerField(db_comment="排序", default=0)),
(
"status",
models.SmallIntegerField(
choices=[(0, "禁用"), (1, "启用")],
db_comment="状态",
default=0,
verbose_name="状态",
),
),
("platform", models.CharField(db_comment="模型平台", max_length=32)),
("model", models.CharField(db_comment="模型标识", max_length=64)),
(
"temperature",
models.FloatField(blank=True, db_comment="温度参数", null=True),
),
(
"max_tokens",
models.IntegerField(
blank=True, db_comment="单条回复的最大 Token 数量", null=True
),
),
(
"max_contexts",
models.IntegerField(
blank=True, db_comment="上下文的最大 Message 数量", null=True
),
),
(
"key",
models.ForeignKey(
db_comment="API 秘钥编号",
on_delete=django.db.models.deletion.CASCADE,
to="ai.aiapikey",
),
),
],
options={
"verbose_name": "AI 模型",
"verbose_name_plural": "AI 模型",
"db_table": "ai_model",
},
),
]

View File

@@ -0,0 +1,262 @@
# Generated by Django 5.2.1 on 2025-07-10 04:07
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("ai", "0001_initial"),
]
operations = [
migrations.AlterField(
model_name="aiapikey",
name="api_key",
field=models.CharField(
db_comment="密钥", max_length=255, verbose_name="密钥"
),
),
migrations.AlterField(
model_name="aiapikey",
name="create_time",
field=models.DateTimeField(
auto_now_add=True,
db_comment="创建时间",
help_text="创建时间",
null=True,
verbose_name="创建时间",
),
),
migrations.AlterField(
model_name="aiapikey",
name="creator",
field=models.CharField(
blank=True,
db_comment="创建人",
help_text="创建人",
max_length=64,
null=True,
verbose_name="创建人",
),
),
migrations.AlterField(
model_name="aiapikey",
name="is_deleted",
field=models.BooleanField(
db_comment="是否软删除", default=False, verbose_name="是否软删除"
),
),
migrations.AlterField(
model_name="aiapikey",
name="modifier",
field=models.CharField(
blank=True,
db_comment="修改人",
help_text="修改人",
max_length=64,
null=True,
verbose_name="修改人",
),
),
migrations.AlterField(
model_name="aiapikey",
name="name",
field=models.CharField(
db_comment="名称", max_length=255, verbose_name="名称"
),
),
migrations.AlterField(
model_name="aiapikey",
name="platform",
field=models.CharField(
choices=[
("AzureOpenAI", "OpenAI 微软"),
("OpenAI", "OpenAI"),
("Ollama", "Ollama"),
("YiYan", "文心一言"),
("XingHuo", "讯飞星火"),
("TongYi", "通义千问"),
("StableDiffusion", "StableDiffusion"),
("Midjourney", "Midjourney"),
("Suno", "Suno"),
("DeepSeek", "DeepSeek"),
("DouBao", "字节豆包"),
("HunYuan", "腾讯混元"),
("SiliconFlow", "硅基流动"),
("ZhiPu", "智谱"),
("MiniMax", "MiniMax"),
("Moonshot", "月之暗灭"),
("BaiChuan", "百川智能"),
],
db_comment="平台",
max_length=100,
verbose_name="平台",
),
),
migrations.AlterField(
model_name="aiapikey",
name="remark",
field=models.CharField(
blank=True,
db_comment="备注",
help_text="备注",
max_length=256,
null=True,
verbose_name="备注",
),
),
migrations.AlterField(
model_name="aiapikey",
name="update_time",
field=models.DateTimeField(
auto_now=True,
db_comment="修改时间",
help_text="修改时间",
null=True,
verbose_name="修改时间",
),
),
migrations.AlterField(
model_name="aiapikey",
name="url",
field=models.CharField(
blank=True,
db_comment="自定义 API 地址",
max_length=255,
null=True,
verbose_name="自定义 API 地址",
),
),
migrations.AlterField(
model_name="aimodel",
name="create_time",
field=models.DateTimeField(
auto_now_add=True,
db_comment="创建时间",
help_text="创建时间",
null=True,
verbose_name="创建时间",
),
),
migrations.AlterField(
model_name="aimodel",
name="creator",
field=models.CharField(
blank=True,
db_comment="创建人",
help_text="创建人",
max_length=64,
null=True,
verbose_name="创建人",
),
),
migrations.AlterField(
model_name="aimodel",
name="is_deleted",
field=models.BooleanField(
db_comment="是否软删除", default=False, verbose_name="是否软删除"
),
),
migrations.AlterField(
model_name="aimodel",
name="key",
field=models.ForeignKey(
db_comment="API 秘钥编号",
on_delete=django.db.models.deletion.CASCADE,
to="ai.aiapikey",
verbose_name="API 秘钥编号",
),
),
migrations.AlterField(
model_name="aimodel",
name="max_contexts",
field=models.IntegerField(
blank=True,
db_comment="上下文的最大 Message 数量",
null=True,
verbose_name="上下文的最大 Message 数量",
),
),
migrations.AlterField(
model_name="aimodel",
name="max_tokens",
field=models.IntegerField(
blank=True,
db_comment="单条回复的最大 Token 数量",
null=True,
verbose_name="单条回复的最大 Token 数量",
),
),
migrations.AlterField(
model_name="aimodel",
name="model",
field=models.CharField(
db_comment="模型标识", max_length=64, verbose_name="模型标识"
),
),
migrations.AlterField(
model_name="aimodel",
name="modifier",
field=models.CharField(
blank=True,
db_comment="修改人",
help_text="修改人",
max_length=64,
null=True,
verbose_name="修改人",
),
),
migrations.AlterField(
model_name="aimodel",
name="name",
field=models.CharField(
db_comment="模型名字", max_length=64, verbose_name="模型名字"
),
),
migrations.AlterField(
model_name="aimodel",
name="platform",
field=models.CharField(
db_comment="模型平台", max_length=32, verbose_name="模型平台"
),
),
migrations.AlterField(
model_name="aimodel",
name="remark",
field=models.CharField(
blank=True,
db_comment="备注",
help_text="备注",
max_length=256,
null=True,
verbose_name="备注",
),
),
migrations.AlterField(
model_name="aimodel",
name="sort",
field=models.IntegerField(
db_comment="排序", default=0, verbose_name="排序"
),
),
migrations.AlterField(
model_name="aimodel",
name="temperature",
field=models.FloatField(
blank=True, db_comment="温度参数", null=True, verbose_name="温度参数"
),
),
migrations.AlterField(
model_name="aimodel",
name="update_time",
field=models.DateTimeField(
auto_now=True,
db_comment="修改时间",
help_text="修改时间",
null=True,
verbose_name="修改时间",
),
),
]

View File

61
backend/ai/models.py Normal file
View File

@@ -0,0 +1,61 @@
from django.db import models
from ai.choices import PlatformChoices
from utils.models import CommonStatus, CoreModel
class AIApiKey(CoreModel):
""" AI API 密钥表 """
name = models.CharField(max_length=255, db_comment="名称", verbose_name="名称")
platform = models.CharField(
max_length=100,
choices=PlatformChoices.choices,
verbose_name="平台",
db_comment="平台"
)
api_key = models.CharField(max_length=255, db_comment="密钥", verbose_name="密钥")
url = models.CharField(max_length=255, null=True, blank=True, db_comment="自定义 API 地址", verbose_name="自定义 API 地址")
status = models.SmallIntegerField(
choices=CommonStatus.choices,
default=CommonStatus.DISABLED,
verbose_name="状态",
db_comment="状态",
)
class Meta:
db_table = "ai_api_key"
verbose_name = "AI API 密钥"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class AIModel(CoreModel):
""" AI 模型 """
name = models.CharField(max_length=64, db_comment="模型名字", verbose_name="模型名字")
sort = models.IntegerField(db_comment="排序", default=0, verbose_name="排序")
status = models.SmallIntegerField(
choices=CommonStatus.choices,
default=CommonStatus.DISABLED,
verbose_name="状态",
db_comment="状态",
)
key = models.ForeignKey(
'AIApiKey',
on_delete=models.CASCADE,
db_comment='API 秘钥编号', verbose_name="API 秘钥编号"
)
platform = models.CharField(max_length=32, db_comment="模型平台", verbose_name="模型平台")
model = models.CharField(max_length=64, db_comment="模型标识", verbose_name="模型标识")
temperature = models.FloatField(null=True, blank=True, db_comment="温度参数", verbose_name="温度参数")
max_tokens = models.IntegerField(null=True, blank=True, db_comment="单条回复的最大 Token 数量", verbose_name="单条回复的最大 Token 数量")
max_contexts = models.IntegerField(null=True, blank=True, db_comment="上下文的最大 Message 数量", verbose_name="上下文的最大 Message 数量")
class Meta:
db_table = "ai_model"
verbose_name = "AI 模型"
verbose_name_plural = verbose_name
def __str__(self):
return self.name

3
backend/ai/tests.py Normal file
View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

11
backend/ai/urls.py Normal file
View File

@@ -0,0 +1,11 @@
from django.urls import include, path
from rest_framework import routers
from . import views
router = routers.DefaultRouter()
router.register(r'ai_api_key', views.AIApiKeyViewSet)
urlpatterns = [
path('', include(router.urls)),
]

3
backend/ai/views.py Normal file
View File

@@ -0,0 +1,3 @@
from django.shortcuts import render
# Create your views here.

View File

@@ -0,0 +1,5 @@
__all__ = [
'AIApiKeyViewSet'
]
from ai.views.ai_api_key import AIApiKeyViewSet

View File

@@ -0,0 +1,27 @@
from ai.models import AIApiKey
from utils.serializers import CustomModelSerializer
from utils.custom_model_viewSet import CustomModelViewSet
class AIApiKeySerializer(CustomModelSerializer):
"""
AI API 密钥 序列化器
"""
class Meta:
model = AIApiKey
fields = '__all__'
read_only_fields = ['id', 'create_time', 'update_time']
class AIApiKeyViewSet(CustomModelViewSet):
"""
AI API 密钥 视图集
"""
queryset = AIApiKey.objects.filter(is_deleted=False).order_by('-id')
serializer_class = AIApiKeySerializer
filterset_fields = ['id', 'remark', 'creator', 'modifier', 'is_deleted', 'name', 'platform', 'api_key', 'url', 'status']
search_fields = ['name'] # 根据实际字段调整
ordering_fields = ['create_time', 'id']
ordering = ['-create_time']
# 移入urls中
#