init ai api key
This commit is contained in:
0
backend/ai/__init__.py
Normal file
0
backend/ai/__init__.py
Normal file
3
backend/ai/admin.py
Normal file
3
backend/ai/admin.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
6
backend/ai/apps.py
Normal file
6
backend/ai/apps.py
Normal 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
21
backend/ai/choices.py
Normal 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', '百川智能'
|
||||
214
backend/ai/migrations/0001_initial.py
Normal file
214
backend/ai/migrations/0001_initial.py
Normal 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",
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -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="修改时间",
|
||||
),
|
||||
),
|
||||
]
|
||||
0
backend/ai/migrations/__init__.py
Normal file
0
backend/ai/migrations/__init__.py
Normal file
61
backend/ai/models.py
Normal file
61
backend/ai/models.py
Normal 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
3
backend/ai/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
11
backend/ai/urls.py
Normal file
11
backend/ai/urls.py
Normal 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
3
backend/ai/views.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.shortcuts import render
|
||||
|
||||
# Create your views here.
|
||||
5
backend/ai/views/__init__.py
Normal file
5
backend/ai/views/__init__.py
Normal file
@@ -0,0 +1,5 @@
|
||||
__all__ = [
|
||||
'AIApiKeyViewSet'
|
||||
]
|
||||
|
||||
from ai.views.ai_api_key import AIApiKeyViewSet
|
||||
27
backend/ai/views/ai_api_key.py
Normal file
27
backend/ai/views/ai_api_key.py
Normal 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中
|
||||
#
|
||||
Reference in New Issue
Block a user