From 8b17f6cb84a290f95eb8e7247c037c740252652c Mon Sep 17 00:00:00 2001 From: gewuyou Date: Wed, 7 May 2025 20:43:05 +0800 Subject: [PATCH 01/44] =?UTF-8?q?feat(core):=20=E9=87=8D=E6=9E=84=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E5=B9=B6=E6=B7=BB=E5=8A=A0=20Docker=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重命名应用名称和包名,统一使用 llmx 前缀- 添加生产环境和测试环境的 Docker 配置文件 - 新增环境变量配置,用于 Docker部署 - 更新构建脚本,支持多模块构建 - 优化应用配置,适配 Docker 环境 --- .gitignore | 1 + build.gradle.kts | 13 ++- buildSrc/build.gradle.kts | 4 +- .../org/jcnc/llmx/plugin/jib/JibPlugin.kt | 9 +- .../jcnc/llmx/plugin/jib/entity/JibProject.kt | 4 +- docker/.env.prod | 3 + docker/.env.test | 3 + docker/docker-compose.dev.yml | 42 ++++++++ docker/docker-compose.test.yml | 42 ++++++++ gradle/libs.versions.toml | 2 +- .../core/service/config/ModelProperties.kt | 2 +- .../src/main/resources/application-dev.yml | 8 +- .../src/main/resources/application.yml | 2 +- .../.gitattributes | 0 .../.gitignore | 0 .../build.gradle.kts | 0 .../baiLian/LlmxImplBailianApplication.kt | 0 .../impl/baiLian/adapter/DashScopeAdapter.kt | 0 .../llmx/impl/baiLian/config/ClientConfig.kt | 0 .../impl/baiLian/config/DashScopeConfig.kt | 0 .../config/entities/DashScopeProperties.kt | 0 .../baiLian/controller/BaiLianProvider.kt | 0 .../baiLian/service/BaiLianModelService.kt | 0 .../src/main/resources/application-dev.yml | 2 +- .../src/main/resources/application-prod.yml | 2 +- .../src/main/resources/application.yml | 2 +- .../src/main/resources/bootstrap-dev.yml | 0 .../LlmhubImplBailianApplicationTests.kt | 0 scripts/entrypoint.sh | 99 +++++++++++++++++++ settings.gradle.kts | 4 +- 30 files changed, 223 insertions(+), 21 deletions(-) create mode 100644 docker/.env.prod create mode 100644 docker/.env.test create mode 100644 docker/docker-compose.dev.yml create mode 100644 docker/docker-compose.test.yml rename llmx-impl/{llmx-impl-baiLian => llmx-impl-bailian}/.gitattributes (100%) rename llmx-impl/{llmx-impl-baiLian => llmx-impl-bailian}/.gitignore (100%) rename llmx-impl/{llmx-impl-baiLian => llmx-impl-bailian}/build.gradle.kts (100%) rename llmx-impl/{llmx-impl-baiLian => llmx-impl-bailian}/src/main/kotlin/org/jcnc/llmx/impl/baiLian/LlmxImplBailianApplication.kt (100%) rename llmx-impl/{llmx-impl-baiLian => llmx-impl-bailian}/src/main/kotlin/org/jcnc/llmx/impl/baiLian/adapter/DashScopeAdapter.kt (100%) rename llmx-impl/{llmx-impl-baiLian => llmx-impl-bailian}/src/main/kotlin/org/jcnc/llmx/impl/baiLian/config/ClientConfig.kt (100%) rename llmx-impl/{llmx-impl-baiLian => llmx-impl-bailian}/src/main/kotlin/org/jcnc/llmx/impl/baiLian/config/DashScopeConfig.kt (100%) rename llmx-impl/{llmx-impl-baiLian => llmx-impl-bailian}/src/main/kotlin/org/jcnc/llmx/impl/baiLian/config/entities/DashScopeProperties.kt (100%) rename llmx-impl/{llmx-impl-baiLian => llmx-impl-bailian}/src/main/kotlin/org/jcnc/llmx/impl/baiLian/controller/BaiLianProvider.kt (100%) rename llmx-impl/{llmx-impl-baiLian => llmx-impl-bailian}/src/main/kotlin/org/jcnc/llmx/impl/baiLian/service/BaiLianModelService.kt (100%) rename llmx-impl/{llmx-impl-baiLian => llmx-impl-bailian}/src/main/resources/application-dev.yml (96%) rename llmx-impl/{llmx-impl-baiLian => llmx-impl-bailian}/src/main/resources/application-prod.yml (96%) rename llmx-impl/{llmx-impl-baiLian => llmx-impl-bailian}/src/main/resources/application.yml (95%) rename llmx-impl/{llmx-impl-baiLian => llmx-impl-bailian}/src/main/resources/bootstrap-dev.yml (100%) rename llmx-impl/{llmx-impl-baiLian => llmx-impl-bailian}/src/test/kotlin/org/jcnc/llmx/impl/baiLian/LlmhubImplBailianApplicationTests.kt (100%) create mode 100644 scripts/entrypoint.sh diff --git a/.gitignore b/.gitignore index 65416dd..1a35780 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,7 @@ out/ !**/src/main/**/out/ !**/src/test/**/out/ gradle.properties +docker/.env.dev ### NetBeans ### /nbproject/private/ /nbbuild/ diff --git a/build.gradle.kts b/build.gradle.kts index d7de339..526774d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -99,7 +99,6 @@ subprojects { plugin(libs.plugins.kotlin.jvm.get().pluginId) plugin(libs.plugins.jibLocalPlugin.get().pluginId) } - println(project.name + ":" + project.getPropertyByBoolean(ProjectFlags.USE_SPRING_BOOT)) kotlin { compilerOptions { @@ -107,10 +106,20 @@ subprojects { } } jibConfig { + val env=System.getenv("SPRING_PROFILES_ACTIVE") project { projectName = "llmx-core-service" ports = listOf("9002") - environment = mapOf("SPRING_PROFILES_ACTIVE" to "prod") + environment = mapOf("SPRING_PROFILES_ACTIVE" to env) + imageName = "llmx-core-service" +// paths = listOf(File(rootProject.projectDir, "scripts").absolutePath) + } + project{ + projectName="llmx-impl-bailian" + ports=listOf("9003") + environment=mapOf("SPRING_PROFILES_ACTIVE" to env) + imageName="llmx-impl-bailian" +// paths = listOf(File(rootProject.projectDir, "scripts").absolutePath) } } } diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index aec6e88..ff9ec97 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -12,8 +12,8 @@ dependencies { gradlePlugin { plugins { register("jib-plugin") { - id = "org.jcnc.llmhub.plugin.jib" - implementationClass = "org.jcnc.llmhub.plugin.jib.JibPlugin" + id = "org.jcnc.llmx.plugin.jib" + implementationClass = "org.jcnc.llmx.plugin.jib.JibPlugin" description = "提供简单的配置构建镜像" } diff --git a/buildSrc/src/main/kotlin/org/jcnc/llmx/plugin/jib/JibPlugin.kt b/buildSrc/src/main/kotlin/org/jcnc/llmx/plugin/jib/JibPlugin.kt index f4a886c..5bc92c1 100644 --- a/buildSrc/src/main/kotlin/org/jcnc/llmx/plugin/jib/JibPlugin.kt +++ b/buildSrc/src/main/kotlin/org/jcnc/llmx/plugin/jib/JibPlugin.kt @@ -52,12 +52,13 @@ class JibPlugin : Plugin { } to { image = - "${System.getenv("LUKE_SERVER_DOCKER_REGISTRY_URL")}/${jibProject.imageName}:${jibProject.version}" + "${System.getenv("DOCKER_REGISTRY_URL")}/${jibProject.imageName}:${jibProject.version}" auth { username = "root" - password = System.getenv("LUKE_SERVER_DOCKER_REGISTRY_PASSWORD") + password = System.getenv("SERVER_PASSWORD") } } + setAllowInsecureRegistries(true) // 动态配置容器参数 container { ports = jibProject.ports @@ -69,7 +70,9 @@ class JibPlugin : Plugin { // 动态配置额外目录 extraDirectories { - setPaths(jibProject.paths) + if(jibProject.paths.isNotEmpty()){ + setPaths(jibProject.paths) + } permissions.putAll(jibProject.permissions) } // 将动态部分移到任务配置中 diff --git a/buildSrc/src/main/kotlin/org/jcnc/llmx/plugin/jib/entity/JibProject.kt b/buildSrc/src/main/kotlin/org/jcnc/llmx/plugin/jib/entity/JibProject.kt index b980719..0e95a2e 100644 --- a/buildSrc/src/main/kotlin/org/jcnc/llmx/plugin/jib/entity/JibProject.kt +++ b/buildSrc/src/main/kotlin/org/jcnc/llmx/plugin/jib/entity/JibProject.kt @@ -19,14 +19,14 @@ data class JibProject( var ports: List = listOf("8080"), var environment: Map = mapOf("SPRING_PROFILES_ACTIVE" to "prod"), var entrypoint: List = emptyList(), - var paths: List = listOf("llmhub-base/scripts/entrypoint.sh"), + var paths: List = listOf(), var imageName: String = "", var version: String = "latest", var permissions: Map = mapOf("/scripts/entrypoint.sh" to "755"), var baseImage: String = "docker://bellsoft/liberica-openjdk-debian:21" ) { init { - if (imageName.isEmpty()) { + if (imageName.isBlank()) { imageName = projectName } } diff --git a/docker/.env.prod b/docker/.env.prod new file mode 100644 index 0000000..b67fef8 --- /dev/null +++ b/docker/.env.prod @@ -0,0 +1,3 @@ +Docker_REGISTRY_URL=49.235.96.75:5000 +SERVER_PASSWORD=L4s6f9y3 +SPRING_PROFILES_ACTIVE=prod \ No newline at end of file diff --git a/docker/.env.test b/docker/.env.test new file mode 100644 index 0000000..5ee1280 --- /dev/null +++ b/docker/.env.test @@ -0,0 +1,3 @@ +Docker_REGISTRY_URL=49.235.96.75:5000 +SERVER_PASSWORD=L4s6f9y3 +SPRING_PROFILES_ACTIVE=test \ No newline at end of file diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml new file mode 100644 index 0000000..6faec0b --- /dev/null +++ b/docker/docker-compose.dev.yml @@ -0,0 +1,42 @@ +services: + llmx-core-database: + image: postgres:16-alpine # 长期支持版本推荐用 16 + container_name: llmx-core-database + restart: always + ports: + - "5432:9052" + networks: + - llmx-net + environment: + POSTGRES_DB: llmx_core + POSTGRES_USER: llmx + POSTGRES_PASSWORD: L4s6f9y3, + volumes: + - llmx-core-db-volume:/var/lib/postgresql/data + llmx-core-service: + image: ${Docker_REGISTRY_URL}/llmx-core-service + container_name: llmx-core-service + ports: + - "9002:9002" + networks: + - llmx-net + volumes: + - llmx-core-service-volume:/app/volume + restart: always + llmx-impl-baiLian: + image: ${Docker_REGISTRY_URL}/llmx-impl-bailian + container_name: llmx-impl-bailian + ports: + - "9003:9003" + networks: + - llmx-net + volumes: + - llmx-impl-baiLian-volume:/app/volume + restart: always +networks: + llmx-net: + driver: bridge +volumes: + llmx-core-service-volume: + llmx-impl-baiLian-volume: + llmx-core-db-volume: \ No newline at end of file diff --git a/docker/docker-compose.test.yml b/docker/docker-compose.test.yml new file mode 100644 index 0000000..4f1f448 --- /dev/null +++ b/docker/docker-compose.test.yml @@ -0,0 +1,42 @@ +services: + llmx-core-database: + image: postgres:16-alpine # 长期支持版本推荐用 16 + container_name: llmx-core-database + restart: always + ports: + - "5432:9052" + networks: + - llmx-net + environment: + POSTGRES_DB: llmx_core + POSTGRES_USER: llmx + POSTGRES_PASSWORD: L4s6f9y3, + volumes: + - llmx-core-db-volume:/var/lib/postgresql/data + llmx-core-service: + image: ${Docker_REGISTRY_URL}/llmx-core-service + container_name: llmx-core-service + ports: + - "9002:9002" + networks: + - llmx-net + volumes: + - llmx-core-service-volume:/app/volume + restart: always + llmx-impl-baiLian: + image: ${Docker_REGISTRY_URL}/llmx-impl-baiLian + container_name: llmx-impl-baiLian + ports: + - "9003:9003" + networks: + - llmx-net + volumes: + - llmx-impl-baiLian-volume:/app/volume + restart: always +networks: + llmx-net-dev: + driver: bridge +volumes: + llmx-core-service-volume: + llmx-impl-baiLian-volume: + llmx-core-db-volume: \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0f54e0f..b965abb 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -26,7 +26,7 @@ spring-dependency-management = { id = "io.spring.dependency-management", version spring-boot = { id = "org.springframework.boot", version.ref = "spring-boot-version" } jib = { id = "com.google.cloud.tools.jib", version.ref = "jib-version" } -jibLocalPlugin = { id = "org.jcnc.llmhub.plugin.jib" } +jibLocalPlugin = { id = "org.jcnc.llmx.plugin.jib" } [libraries] jib-gradlePlugin = { module = "com.google.cloud.tools.jib:com.google.cloud.tools.jib.gradle.plugin", version.ref = "jib-version" } # bom diff --git a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/ModelProperties.kt b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/ModelProperties.kt index a6d8091..4e705c1 100644 --- a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/ModelProperties.kt +++ b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/ModelProperties.kt @@ -9,7 +9,7 @@ import org.springframework.cloud.context.config.annotation.RefreshScope * @since 2025-04-26 18:01:48 * @author gewuyou */ -@ConfigurationProperties(prefix = "llmhub.model-route") +@ConfigurationProperties(prefix = "llmx.model-route") @RefreshScope open class ModelProperties { /** diff --git a/llmx-core/llmx-core-service/src/main/resources/application-dev.yml b/llmx-core/llmx-core-service/src/main/resources/application-dev.yml index f6ea2d1..4eb3cbd 100644 --- a/llmx-core/llmx-core-service/src/main/resources/application-dev.yml +++ b/llmx-core/llmx-core-service/src/main/resources/application-dev.yml @@ -3,11 +3,11 @@ server: spring: config: import: classpath:bootstrap-dev.yml -llmhub: +llmx: model-route: modelServiceMap: - qwen-turbo: llmhub-impl-baiLian - qwen-max: llmhub-impl-baiLian - qwen-plus: llmhub-impl-baiLian + qwen-turbo: llmx-impl-baiLian + qwen-max: llmx-impl-baiLian + qwen-plus: llmx-impl-baiLian diff --git a/llmx-core/llmx-core-service/src/main/resources/application.yml b/llmx-core/llmx-core-service/src/main/resources/application.yml index 4e5448d..dd04bca 100644 --- a/llmx-core/llmx-core-service/src/main/resources/application.yml +++ b/llmx-core/llmx-core-service/src/main/resources/application.yml @@ -1,5 +1,5 @@ spring: application: - name: llmhub-core-service + name: llmx-core-service profiles: active: dev diff --git a/llmx-impl/llmx-impl-baiLian/.gitattributes b/llmx-impl/llmx-impl-bailian/.gitattributes similarity index 100% rename from llmx-impl/llmx-impl-baiLian/.gitattributes rename to llmx-impl/llmx-impl-bailian/.gitattributes diff --git a/llmx-impl/llmx-impl-baiLian/.gitignore b/llmx-impl/llmx-impl-bailian/.gitignore similarity index 100% rename from llmx-impl/llmx-impl-baiLian/.gitignore rename to llmx-impl/llmx-impl-bailian/.gitignore diff --git a/llmx-impl/llmx-impl-baiLian/build.gradle.kts b/llmx-impl/llmx-impl-bailian/build.gradle.kts similarity index 100% rename from llmx-impl/llmx-impl-baiLian/build.gradle.kts rename to llmx-impl/llmx-impl-bailian/build.gradle.kts diff --git a/llmx-impl/llmx-impl-baiLian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/LlmxImplBailianApplication.kt b/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/LlmxImplBailianApplication.kt similarity index 100% rename from llmx-impl/llmx-impl-baiLian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/LlmxImplBailianApplication.kt rename to llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/LlmxImplBailianApplication.kt diff --git a/llmx-impl/llmx-impl-baiLian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/adapter/DashScopeAdapter.kt b/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/adapter/DashScopeAdapter.kt similarity index 100% rename from llmx-impl/llmx-impl-baiLian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/adapter/DashScopeAdapter.kt rename to llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/adapter/DashScopeAdapter.kt diff --git a/llmx-impl/llmx-impl-baiLian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/config/ClientConfig.kt b/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/config/ClientConfig.kt similarity index 100% rename from llmx-impl/llmx-impl-baiLian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/config/ClientConfig.kt rename to llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/config/ClientConfig.kt diff --git a/llmx-impl/llmx-impl-baiLian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/config/DashScopeConfig.kt b/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/config/DashScopeConfig.kt similarity index 100% rename from llmx-impl/llmx-impl-baiLian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/config/DashScopeConfig.kt rename to llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/config/DashScopeConfig.kt diff --git a/llmx-impl/llmx-impl-baiLian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/config/entities/DashScopeProperties.kt b/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/config/entities/DashScopeProperties.kt similarity index 100% rename from llmx-impl/llmx-impl-baiLian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/config/entities/DashScopeProperties.kt rename to llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/config/entities/DashScopeProperties.kt diff --git a/llmx-impl/llmx-impl-baiLian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/controller/BaiLianProvider.kt b/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/controller/BaiLianProvider.kt similarity index 100% rename from llmx-impl/llmx-impl-baiLian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/controller/BaiLianProvider.kt rename to llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/controller/BaiLianProvider.kt diff --git a/llmx-impl/llmx-impl-baiLian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/service/BaiLianModelService.kt b/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/service/BaiLianModelService.kt similarity index 100% rename from llmx-impl/llmx-impl-baiLian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/service/BaiLianModelService.kt rename to llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/service/BaiLianModelService.kt diff --git a/llmx-impl/llmx-impl-baiLian/src/main/resources/application-dev.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/application-dev.yml similarity index 96% rename from llmx-impl/llmx-impl-baiLian/src/main/resources/application-dev.yml rename to llmx-impl/llmx-impl-bailian/src/main/resources/application-dev.yml index 7bb8cd6..dd757e1 100644 --- a/llmx-impl/llmx-impl-baiLian/src/main/resources/application-dev.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/application-dev.yml @@ -4,7 +4,7 @@ spring: config: import: classpath:bootstrap-dev.yml application: - name: llmhub-impl-baiLian + name: llmx-impl-baiLian cloud: nacos: discovery: diff --git a/llmx-impl/llmx-impl-baiLian/src/main/resources/application-prod.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/application-prod.yml similarity index 96% rename from llmx-impl/llmx-impl-baiLian/src/main/resources/application-prod.yml rename to llmx-impl/llmx-impl-bailian/src/main/resources/application-prod.yml index b39b48c..276545e 100644 --- a/llmx-impl/llmx-impl-baiLian/src/main/resources/application-prod.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/application-prod.yml @@ -2,7 +2,7 @@ server: port: 9003 spring: application: - name: llmhub-impl-baiLian + name: llmx-impl-baiLian cloud: nacos: discovery: diff --git a/llmx-impl/llmx-impl-baiLian/src/main/resources/application.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/application.yml similarity index 95% rename from llmx-impl/llmx-impl-baiLian/src/main/resources/application.yml rename to llmx-impl/llmx-impl-bailian/src/main/resources/application.yml index b9fc61b..e7bb9d6 100644 --- a/llmx-impl/llmx-impl-baiLian/src/main/resources/application.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: application: - name: llmhub-impl-baiLian + name: llmx-impl-baiLian profiles: active: dev # 阿里云配置 diff --git a/llmx-impl/llmx-impl-baiLian/src/main/resources/bootstrap-dev.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-dev.yml similarity index 100% rename from llmx-impl/llmx-impl-baiLian/src/main/resources/bootstrap-dev.yml rename to llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-dev.yml diff --git a/llmx-impl/llmx-impl-baiLian/src/test/kotlin/org/jcnc/llmx/impl/baiLian/LlmhubImplBailianApplicationTests.kt b/llmx-impl/llmx-impl-bailian/src/test/kotlin/org/jcnc/llmx/impl/baiLian/LlmhubImplBailianApplicationTests.kt similarity index 100% rename from llmx-impl/llmx-impl-baiLian/src/test/kotlin/org/jcnc/llmx/impl/baiLian/LlmhubImplBailianApplicationTests.kt rename to llmx-impl/llmx-impl-bailian/src/test/kotlin/org/jcnc/llmx/impl/baiLian/LlmhubImplBailianApplicationTests.kt diff --git a/scripts/entrypoint.sh b/scripts/entrypoint.sh new file mode 100644 index 0000000..0378a7e --- /dev/null +++ b/scripts/entrypoint.sh @@ -0,0 +1,99 @@ +#!/bin/bash +#set -x # 调试模式,可以启用以打印每行脚本的执行情况 + +# 设置默认的等待时间间隔,默认值为2秒 +: "${SLEEP_SECOND:=2}" +# 设置默认的超时时间,默认值为60秒 +: "${TIMEOUT:=60}" + +# 带时间戳+emoji的小型日志函数 +log() { + echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" +} + +# 等待服务函数 +wait_for() { + local host="$1" + local port="$2" + local timeout="$TIMEOUT" + local start_time + local current_time + local elapsed_time + local attempt=0 + + start_time=$(date +%s) + log "🔄 开始等待依赖服务 $host:$port 可用 (超时时间: ${timeout}s, 间隔: ${SLEEP_SECOND}s)" + + while ! nc -z "$host" "$port" 2>/dev/null; do + current_time=$(date +%s) + elapsed_time=$((current_time - start_time)) + attempt=$((attempt + 1)) + + if [ "$elapsed_time" -ge "$timeout" ]; then + log "🛑 [ERROR] 等待超时!依赖服务 $host:$port 在 ${timeout}s 内未启动" + return 1 + fi + + log "🔄 第 ${attempt} 次检测:$host:$port 未就绪,已等待 ${elapsed_time}s..." + sleep "$SLEEP_SECOND" + done + + total_time=$(( $(date +%s) - start_time )) + log "✅ [SUCCESS] 依赖服务 $host:$port 已启动,耗时 ${total_time}s" + return 0 +} + +# 声明变量 +declare DEPENDS +declare CMD + +# 解析参数 +while getopts "d:c:" arg; do + case "$arg" in + d) + DEPENDS="$OPTARG" + ;; + c) + CMD="$OPTARG" + ;; + ?) + log "🛑 [ERROR] 未知参数" + exit 1 + ;; + esac +done + +# 检查依赖 +if [ -n "$DEPENDS" ]; then + log "📦 检测到依赖服务列表: $DEPENDS" + for var in ${DEPENDS//,/ }; do + host=${var%:*} + port=${var#*:} + if [ -z "$host" ] || [ -z "$port" ]; then + log "🛑 [ERROR] 依赖项格式错误: $var,应为 host:port" + exit 1 + fi + + if ! wait_for "$host" "$port"; then + log "❌ [ERROR] 依赖服务 $host:$port 启动失败,终止执行" + exit 1 + fi + done +else + log "⚡️ 未配置依赖服务,跳过依赖检测" +fi + +# 执行命令 +if [ -n "$CMD" ]; then + log "🚀 准备执行命令: $CMD" + eval "$CMD" + cmd_exit_code=$? + if [ $cmd_exit_code -eq 0 ]; then + log "✅ [SUCCESS] 命令执行完成,退出码: $cmd_exit_code" + else + log "❌ [ERROR] 命令执行失败,退出码: $cmd_exit_code" + exit $cmd_exit_code + fi +else + log "⚠️ [WARNING] 未指定要执行的命令,脚本结束" +fi diff --git a/settings.gradle.kts b/settings.gradle.kts index 282051c..e3f326d 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -13,8 +13,8 @@ project(":llmx-core:llmx-core-spi").name = "llmx-core-spi" include( "llmx-impl", - "llmx-impl:llmx-impl-baiLian", + "llmx-impl:llmx-impl-bailian", // "llmx-impl:llmx-impl-openAi", ) -project(":llmx-impl:llmx-impl-baiLian").name = "llmx-impl-baiLian" +project(":llmx-impl:llmx-impl-bailian").name = "llmx-impl-bailian" //project(":llmx-impl:llmx-impl-openAi").name = "llmx-impl-openAi" \ No newline at end of file -- 2.47.2 From 73eeaa19c1dff132a54633b4a0095bb31095d343 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Wed, 7 May 2025 22:14:06 +0800 Subject: [PATCH 02/44] =?UTF-8?q?ci/cd:=20=E6=96=B0=E5=A2=9E=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=8E=AF=E5=A2=83=E9=83=A8=E7=BD=B2=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除旧的 .env 文件 - 添加新的应用配置文件 - 更新 Docker Compose 文件 - 新增 Gitea CI/CD 工作流 - 修改 Nacos 配置 - 修正文件名大小写 --- .gitea/workflow/deploy.test.yml | 128 ++++++++++++++++++ .gitignore | 1 - docker/.env.prod | 3 - docker/.env.test | 3 - docker/docker-compose.test.yml | 46 +++++-- gradle/wrapper/gradle-wrapper.properties | 2 +- .../src/main/resources/application-test.yml | 13 ++ .../src/main/resources/bootstrap-test.yml | 10 ++ .../service/impl/BaiLianModelServiceImpl.kt | 2 +- .../src/main/resources/application-test.yml | 20 +++ .../src/main/resources/bootstrap-test.yml | 10 ++ 11 files changed, 216 insertions(+), 22 deletions(-) create mode 100644 .gitea/workflow/deploy.test.yml delete mode 100644 docker/.env.prod delete mode 100644 docker/.env.test create mode 100644 llmx-core/llmx-core-service/src/main/resources/application-test.yml create mode 100644 llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml rename llmx-impl/{llmx-impl-baiLian => llmx-impl-bailian}/src/main/kotlin/org/jcnc/llmx/impl/baiLian/service/impl/BaiLianModelServiceImpl.kt (98%) create mode 100644 llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml create mode 100644 llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml diff --git a/.gitea/workflow/deploy.test.yml b/.gitea/workflow/deploy.test.yml new file mode 100644 index 0000000..c7446d9 --- /dev/null +++ b/.gitea/workflow/deploy.test.yml @@ -0,0 +1,128 @@ +name: CI/CD Pipeline + +on: + push: + branches: + - test # 触发构建的分支 + +env: + # ========== 环境变量配置 ========== + REGISTRY_URL: ${{vars.REGISTRY_URL}} # 私有Docker镜像仓库地址 + PROJECT_NAME: llmx # 项目名称 + COMPOSE_FILE: docker-compose.test.yml # Docker compose文件路径 + LUKE_SERVER_DOCKER_REGISTRY_PASSWORD: ${{ secrets.SERVER_PASSWORD }} # 仓库密码 + JCNC_GITEA_URL: ${{vars.SERVER_GITEA_URL}} # Gitea地址 + RUNNER_TOOL_CACHE: /opt/tools-cache # 工具缓存目录 + GRADLE_CACHE_KEY: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + SPRING_PROFILES_ACTIVE: test + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + container: + image: jcnc/act-runner:latest # 使用自定义Runner镜像 + options: --user root # 以root用户运行(需要docker权限) + + steps: + # ========== 1. 代码检出 ========== + - name: 🛒 Checkout source code + uses: ${{env.JCNC_GITEA_URL}}/actions/checkout@v4 + with: + fetch-depth: 0 # 获取完整git历史(某些插件需要) + + # ========== 2. Docker环境准备 ========== + - name: 🐳 Install Docker Environment + run: | + echo "=== 检查Docker安装状态 ===" + if ! command -v docker >/dev/null; then + echo "❌ Docker未安装,开始安装..." + curl -fsSL https://get.docker.com | sh | tee docker-install.log + echo "✅ Docker安装完成" + echo "✅ Docker Compose安装完成" + else + echo "ℹ️ Docker已安装,版本: $(docker -v)" + echo "ℹ️ Docker Compose已安装,版本: $(docker compose version)" + fi + + # ========== 3. Gradle环境准备 ========== + - name: 🔧 Prepare Gradle Environment + run: | + echo "赋予gradlew执行权限..." + chmod +x gradlew + echo "当前目录结构:" + ls -al + # ========== 4. 恢复缓存 ========== + - name: 📦 Use Cache + id: cache + uses: ${{env.JCNC_GITEA_URL}}/actions/cache/restore@v4 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + ~/.cache + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + env: + ACTIONS_RUNNER_DEBUG: true # 启用缓存调试输出 + + - name: ⚙️ Setup Gradle + uses: ${{env.JCNC_GITEA_URL}}/gradle/actions/setup-gradle@v4 + with: + gradle-version: wrapper # 使用项目自带的gradle-wrapper + + # ========== 5. 构建阶段 ========== + - name: 🏗️ Build with Jib + run: | + echo "开始构建Docker镜像..." + ./gradlew jib --stacktrace --build-cache --info -Dorg.gradle.caching=true -Dorg.gradle.jvmargs="-Xmx2g -Xms2g -XX:MaxMetaspaceSize=1g" | tee build.log + + echo "=== 镜像构建结果 ===" + docker images | grep ${{env.PROJECT_NAME}} + - name: 🛑 Stop Gradle Daemon + run: | + echo "停止Gradle守护进程..." + ./gradlew --stop + echo "剩余Java进程:" + ps aux | grep java || true + # ========== 6. 保存缓存 ========== + - name: 📦 Save Cache + id: cache + uses: ${{env.JCNC_GITEA_URL}}/actions/cache/save@v4 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + ~/.cache + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + env: + ACTIONS_RUNNER_DEBUG: true # 启用缓存调试输出 + # ========== 7. 部署阶段 ========== + - name: 🔧 Prepare Deployment + run: | + echo "准备部署环境..." + chmod +x ${COMPOSE_FILE} + echo "当前Docker状态:" + docker ps -a + + - name: 🧹 Clean Old Containers + run: | + echo "清理旧容器..." + docker compose -f ${COMPOSE_FILE} down --remove-orphans + echo "清理后Docker状态:" + docker ps -a + + - name: 🚀 Deploy New Version + run: | + echo "拉取最新镜像..." + docker compose -f ${COMPOSE_FILE} pull + + echo "启动新服务..." + docker compose -f ${COMPOSE_FILE} up -d + + echo "=== 服务状态检查 ===" + docker compose -f ${COMPOSE_FILE} ps \ No newline at end of file diff --git a/.gitignore b/.gitignore index 1a35780..65416dd 100644 --- a/.gitignore +++ b/.gitignore @@ -27,7 +27,6 @@ out/ !**/src/main/**/out/ !**/src/test/**/out/ gradle.properties -docker/.env.dev ### NetBeans ### /nbproject/private/ /nbbuild/ diff --git a/docker/.env.prod b/docker/.env.prod deleted file mode 100644 index b67fef8..0000000 --- a/docker/.env.prod +++ /dev/null @@ -1,3 +0,0 @@ -Docker_REGISTRY_URL=49.235.96.75:5000 -SERVER_PASSWORD=L4s6f9y3 -SPRING_PROFILES_ACTIVE=prod \ No newline at end of file diff --git a/docker/.env.test b/docker/.env.test deleted file mode 100644 index 5ee1280..0000000 --- a/docker/.env.test +++ /dev/null @@ -1,3 +0,0 @@ -Docker_REGISTRY_URL=49.235.96.75:5000 -SERVER_PASSWORD=L4s6f9y3 -SPRING_PROFILES_ACTIVE=test \ No newline at end of file diff --git a/docker/docker-compose.test.yml b/docker/docker-compose.test.yml index 4f1f448..038a5fd 100644 --- a/docker/docker-compose.test.yml +++ b/docker/docker-compose.test.yml @@ -1,25 +1,27 @@ services: - llmx-core-database: - image: postgres:16-alpine # 长期支持版本推荐用 16 - container_name: llmx-core-database + llmx-nacos: + image: nacos/nacos-server:v2.3.2 + container_name: llmx-nacos restart: always ports: - - "5432:9052" + - "8848:9001" + - "9848:9053" + - "9849:9054" networks: - - llmx-net + - llmx-net-test environment: - POSTGRES_DB: llmx_core - POSTGRES_USER: llmx - POSTGRES_PASSWORD: L4s6f9y3, + MODE: standalone # 显式指定为单体模式 volumes: - - llmx-core-db-volume:/var/lib/postgresql/data + - llmx-nacos-volume:/nacos/data llmx-core-service: image: ${Docker_REGISTRY_URL}/llmx-core-service container_name: llmx-core-service ports: - "9002:9002" networks: - - llmx-net + - llmx-net-test + environment: + SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE} volumes: - llmx-core-service-volume:/app/volume restart: always @@ -29,14 +31,32 @@ services: ports: - "9003:9003" networks: - - llmx-net + - llmx-net-test + environment: + SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE} volumes: - llmx-impl-baiLian-volume:/app/volume restart: always + llmx-core-database: + image: postgres:16-alpine # 长期支持版本推荐用 16 + container_name: llmx-core-database + restart: always + ports: + - "5432:9052" + networks: + - llmx-net-test + environment: + POSTGRES_DB: llmx_core + POSTGRES_USER: llmx + POSTGRES_PASSWORD: L4s6f9y3, + volumes: + - llmx-core-db-volume:/var/lib/postgresql/data + networks: - llmx-net-dev: + llmx-net-test: driver: bridge volumes: llmx-core-service-volume: llmx-impl-baiLian-volume: - llmx-core-db-volume: \ No newline at end of file + llmx-core-db-volume: + llmx-nacos-volume: \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index cea7a79..3b023b8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip +distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-8.12-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/llmx-core/llmx-core-service/src/main/resources/application-test.yml b/llmx-core/llmx-core-service/src/main/resources/application-test.yml new file mode 100644 index 0000000..0eca13f --- /dev/null +++ b/llmx-core/llmx-core-service/src/main/resources/application-test.yml @@ -0,0 +1,13 @@ +server: + port: 9002 +spring: + config: + import: classpath:bootstrap-test.yml +llmx: + model-route: + modelServiceMap: + qwen-turbo: llmx-impl-baiLian + qwen-max: llmx-impl-baiLian + qwen-plus: llmx-impl-baiLian + + diff --git a/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml b/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml new file mode 100644 index 0000000..c9dc5c7 --- /dev/null +++ b/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml @@ -0,0 +1,10 @@ +spring: + cloud: + nacos: + username: nacos + password: L4s6f9y3 + server-addr: 49.235.96.75:9001 + discovery: + server-addr: ${spring.cloud.nacos.server-addr} + username: ${spring.cloud.nacos.username} + password: ${spring.cloud.nacos.password} \ No newline at end of file diff --git a/llmx-impl/llmx-impl-baiLian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/service/impl/BaiLianModelServiceImpl.kt b/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/service/impl/BaiLianModelServiceImpl.kt similarity index 98% rename from llmx-impl/llmx-impl-baiLian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/service/impl/BaiLianModelServiceImpl.kt rename to llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/service/impl/BaiLianModelServiceImpl.kt index a0bb423..73c7d6b 100644 --- a/llmx-impl/llmx-impl-baiLian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/service/impl/BaiLianModelServiceImpl.kt +++ b/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/service/impl/BaiLianModelServiceImpl.kt @@ -47,7 +47,7 @@ class BaiLianModelServiceImpl( // 构造输入参数,主要包括用户的prompt val inputMap = mutableMapOf("prompt" to request.prompt) // 获取会话ID,如果存在,则添加到输入参数中 - val sessionId = (request.options["session_id"] ?: "").toString() + val sessionId = (request.options["session_id"] ?: "") if (StringUtils.hasText(sessionId)) { inputMap["session_id"] = sessionId } diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml new file mode 100644 index 0000000..c1d931f --- /dev/null +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml @@ -0,0 +1,20 @@ +server: + port: 8082 +spring: + config: + import: classpath:bootstrap-test.yml + application: + name: llmx-impl-bailian +# 阿里云配置 +aliyun: + # DashScope服务配置 + dash: + # 访问凭证配置 + scope: + access-key-id: LTAI5tHiA2Ry3XTAfoSEJW6z # 阿里云访问密钥ID + access-key-secret: K5sf4FxZZuUgLEFnyfepBfMqFGmDcD # 阿里云访问密钥密钥 + endpoint: bailian.cn-beijing.aliyuncs.com # 阿里云服务端点 + workspace-id: llm-axfkuqft05uzbjpi # 工作区ID + api-key: sk-78af4dd964a94f4cb373851064dbdc12 # API密钥 + app-id: 3fae0bbab2e54a90a37aa02cd12dd62c # 应用ID + base-url: https://dashscope.aliyuncs.com/api/v1/apps/ # 基础API URL diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml new file mode 100644 index 0000000..c9dc5c7 --- /dev/null +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml @@ -0,0 +1,10 @@ +spring: + cloud: + nacos: + username: nacos + password: L4s6f9y3 + server-addr: 49.235.96.75:9001 + discovery: + server-addr: ${spring.cloud.nacos.server-addr} + username: ${spring.cloud.nacos.username} + password: ${spring.cloud.nacos.password} \ No newline at end of file -- 2.47.2 From 6bf046d6e06dec02d5df94e4418dccab1ff99a91 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Wed, 7 May 2025 22:59:39 +0800 Subject: [PATCH 03/44] =?UTF-8?q?refactor(llmx):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E9=85=8D=E7=BD=AE=E5=92=8C=E7=BD=91=E7=BB=9C?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 更新 Nacos 配置中的 IP地址 - 修改 Spring Boot项目配置,使用更具体的 USE_SPRING_BOOT_WEB 标志 - 重构 DashScopeAdapter 中的网络请求和响应处理逻辑,提高可读性和维护性 - 在 ChatController 和 LLMProvider 中添加 NDJSON 媒体类型支持 --- build.gradle.kts | 5 +- buildSrc/src/main/kotlin/ProjectFlags.kt | 2 +- llmx-core/llmx-core-service/build.gradle.kts | 2 +- .../core/service/controller/ChatController.kt | 3 +- .../src/main/resources/bootstrap-dev.yml | 2 +- .../llmx/core/spi/provider/LLMProvider.kt | 3 +- llmx-impl/llmx-impl-bailian/build.gradle.kts | 2 +- .../impl/baiLian/adapter/DashScopeAdapter.kt | 112 +++++++++++------- .../src/main/resources/bootstrap-dev.yml | 2 +- 9 files changed, 83 insertions(+), 50 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 526774d..77531ba 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -19,7 +19,7 @@ configurations.implementation { allprojects { // 设置全局属性 ext { - set(ProjectFlags.USE_SPRING_BOOT, false) + set(ProjectFlags.USE_SPRING_BOOT_WEB, false) set(ProjectFlags.USE_LLM_CORE_SPI, false) set(ProjectFlags.USE_SPRING_CLOUD_BOM, false) set(ProjectFlags.IS_ROOT_MODULE, false) @@ -67,7 +67,8 @@ allprojects { subprojects { afterEvaluate { // springbootWeb - if (project.getPropertyByBoolean(ProjectFlags.USE_SPRING_BOOT)) { + // springbootWeb + if (project.getPropertyByBoolean(ProjectFlags.USE_SPRING_BOOT_WEB)) { apply { plugin(libs.plugins.spring.dependency.management.get().pluginId) plugin(libs.plugins.spring.boot.get().pluginId) diff --git a/buildSrc/src/main/kotlin/ProjectFlags.kt b/buildSrc/src/main/kotlin/ProjectFlags.kt index eb7999b..db93d4a 100644 --- a/buildSrc/src/main/kotlin/ProjectFlags.kt +++ b/buildSrc/src/main/kotlin/ProjectFlags.kt @@ -1,5 +1,5 @@ object ProjectFlags { - const val USE_SPRING_BOOT = "useSpringBoot" + const val USE_SPRING_BOOT_WEB = "useSpringBootWeb" const val USE_SPRING_CLOUD_BOM = "useSpringCloudBom" const val USE_LLM_CORE_SPI = "useLLMCoreSPI" const val IS_ROOT_MODULE = "isRootModule" diff --git a/llmx-core/llmx-core-service/build.gradle.kts b/llmx-core/llmx-core-service/build.gradle.kts index c35e025..1dd6a57 100644 --- a/llmx-core/llmx-core-service/build.gradle.kts +++ b/llmx-core/llmx-core-service/build.gradle.kts @@ -1,6 +1,6 @@ extra { // 开启springboot - setProperty(ProjectFlags.USE_SPRING_BOOT, true) + setProperty(ProjectFlags.USE_SPRING_BOOT_WEB, true) setProperty(ProjectFlags.USE_SPRING_CLOUD_BOM,true) } dependencies { diff --git a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/controller/ChatController.kt b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/controller/ChatController.kt index ce5ea4c..bf3570a 100644 --- a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/controller/ChatController.kt +++ b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/controller/ChatController.kt @@ -5,6 +5,7 @@ import kotlinx.coroutines.flow.Flow import org.jcnc.llmx.core.service.service.impl.LLMServiceImpl import org.jcnc.llmx.core.spi.entities.request.ChatRequest import org.jcnc.llmx.core.spi.entities.response.ChatResponsePart +import org.springframework.http.MediaType import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody @@ -33,7 +34,7 @@ class ChatController( * @param request 聊天请求对象,包含了发起聊天所需的各种参数和用户信息 * @return 返回一个Flow流,流中依次提供了聊天响应的部分数据,允许异步处理和逐步消费响应内容 */ - @PostMapping("/stream") + @PostMapping("/stream", produces = [MediaType.APPLICATION_NDJSON_VALUE]) fun chat(@RequestBody request: ChatRequest): Flow { return llmServiceImpl.chat(request) } diff --git a/llmx-core/llmx-core-service/src/main/resources/bootstrap-dev.yml b/llmx-core/llmx-core-service/src/main/resources/bootstrap-dev.yml index d1e2592..37654f9 100644 --- a/llmx-core/llmx-core-service/src/main/resources/bootstrap-dev.yml +++ b/llmx-core/llmx-core-service/src/main/resources/bootstrap-dev.yml @@ -4,7 +4,7 @@ spring: username: nacos password: L4s6f9y3 server-addr: 49.235.96.75:8848 - ip: 192.168.1.6 + ip: 192.168.1.100 discovery: server-addr: ${spring.cloud.nacos.server-addr} username: ${spring.cloud.nacos.username} diff --git a/llmx-core/llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi/provider/LLMProvider.kt b/llmx-core/llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi/provider/LLMProvider.kt index f390c4b..404c127 100644 --- a/llmx-core/llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi/provider/LLMProvider.kt +++ b/llmx-core/llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi/provider/LLMProvider.kt @@ -5,6 +5,7 @@ import org.jcnc.llmx.core.spi.entities.request.ChatRequest import org.jcnc.llmx.core.spi.entities.request.EmbeddingRequest import org.jcnc.llmx.core.spi.entities.response.ChatResponsePart import org.jcnc.llmx.core.spi.entities.response.EmbeddingResponse +import org.springframework.http.MediaType import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestMapping @@ -29,7 +30,7 @@ interface LLMProvider { * @param request 聊天请求对象,包含建立聊天所需的信息,如用户标识、会话标识等 * @return 返回一个Flow流,通过该流可以接收到聊天响应的部分数据,如消息、状态更新等 */ - @PostMapping("/chat") + @PostMapping("/chat", produces = [MediaType.APPLICATION_NDJSON_VALUE]) fun chat(request: ChatRequest): Flow /** diff --git a/llmx-impl/llmx-impl-bailian/build.gradle.kts b/llmx-impl/llmx-impl-bailian/build.gradle.kts index 12471f2..c27bbf7 100644 --- a/llmx-impl/llmx-impl-bailian/build.gradle.kts +++ b/llmx-impl/llmx-impl-bailian/build.gradle.kts @@ -1,6 +1,6 @@ // 开启springboot -extra[ProjectFlags.USE_SPRING_BOOT] = true +setProperty(ProjectFlags.USE_SPRING_BOOT_WEB, true) setProperty(ProjectFlags.USE_SPRING_CLOUD_BOM,true) dependencies { // Nacos 服务发现和配置 diff --git a/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/adapter/DashScopeAdapter.kt b/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/adapter/DashScopeAdapter.kt index d1b31c0..64e229a 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/adapter/DashScopeAdapter.kt +++ b/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/adapter/DashScopeAdapter.kt @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper import com.gewuyou.forgeboot.core.extension.log import kotlinx.coroutines.* import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.FlowCollector import kotlinx.coroutines.flow.flow import okhttp3.Headers.Companion.toHeaders import okhttp3.MediaType.Companion.toMediaType @@ -54,52 +55,81 @@ class DashScopeAdapter( val requestJson = objectMapper.writeValueAsString(requestBody) log.info("📤 请求参数: {}", requestJson) - val request = Request.Builder() - .url(url) - .headers(headers.toHeaders()) - .post(requestJson.toRequestBody("application/json".toMediaType())) - .build() + val request = buildRequest(url, headers, requestJson) - val call = okHttpClient.newCall(request) - val response = call.execute() + okHttpClient.newCall(request).execute().use { response -> + if (!response.isSuccessful) { + throw RuntimeException("❌ DashScope 请求失败: HTTP ${response.code}") + } - if (!response.isSuccessful) { - throw RuntimeException("❌ DashScope 请求失败: HTTP ${response.code}") - } + val responseBody = response.body ?: throw RuntimeException("❌ DashScope 响应体为空") - val responseBody = response.body ?: throw RuntimeException("❌ DashScope 响应体为空") - - val bufferedReader: BufferedReader = responseBody.charStream().buffered() - val allContent = StringBuilder() - - try { - while (currentCoroutineContext().isActive) { - val line = withContext(dispatcher) { - bufferedReader.readLine() - } ?: break - log.info("📥 接收到行: {}", line) - - if (line.startsWith("data:")) { - val jsonPart = line.removePrefix("data:").trim() - try { - val part = extractContent(jsonPart) - allContent.append(part.content) - log.info("✅ 提取内容: {}", part) - emit(part) - } catch (e: Exception) { - log.warn("⚠️ 无法解析 JSON: {}", jsonPart, e) - } + responseBody.charStream().buffered().use { reader -> + val allContent = StringBuilder() + try { + processResponse(dispatcher, reader, extractContent, allContent) + log.info("📦 完整内容: {}", allContent) + } catch (e: Exception) { + log.error("🚨 读取 DashScope 响应流失败: {}", e.message, e) + throw e } } - log.info("📦 完整内容: {}", allContent) - } catch (e: Exception) { - log.error("🚨 读取 DashScope 响应流失败: {}", e.message, e) - throw e - } finally { - withContext(dispatcher) { - bufferedReader.close() - } - response.close() } } + + /** + * 处理响应流 + * + * 本函数读取HTTP响应中的数据行,解析并提取内容。 + * 它在循环中读取每一行,并使用提供的函数提取内容。 + * + * @param dispatcher 协程调度器 + * @param reader 响应体的BufferedReader + * @param extractContent 一个函数,用于从JSON响应中提取内容 + * @param allContent 保存所有提取内容的StringBuilder + */ + private suspend fun FlowCollector.processResponse( + dispatcher: CoroutineDispatcher, + reader: BufferedReader, + extractContent: (String) -> ChatResponsePart, + allContent: StringBuilder + ) { + while (currentCoroutineContext().isActive) { + val line = withContext(dispatcher) { + reader.readLine() + } ?: break + + log.debug("📥 接收到行: {}", line) + + if (line.startsWith("data:")) { + val jsonPart = line.removePrefix("data:").trim() + try { + val part = extractContent(jsonPart) + allContent.append(part.content) + log.debug("✅ 提取内容: {}", part) + emit(part) + } catch (e: Exception) { + log.warn("⚠️ 无法解析 JSON: {}", jsonPart, e) + } + } + } + } + + /** + * 构建请求 + * + * 本函数构建一个OkHttp请求对象,用于发送聊天请求。 + * + * @param url 请求的URL + * @param headers 请求的头部信息 + * @param json 请求的主体内容的JSON字符串 + * @return 返回构建好的Request对象 + */ + private fun buildRequest(url: String, headers: Map, json: String): Request { + return Request.Builder() + .url(url) + .headers(headers.toHeaders()) + .post(json.toRequestBody("application/json".toMediaType())) + .build() + } } diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-dev.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-dev.yml index d1e2592..37654f9 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-dev.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-dev.yml @@ -4,7 +4,7 @@ spring: username: nacos password: L4s6f9y3 server-addr: 49.235.96.75:8848 - ip: 192.168.1.6 + ip: 192.168.1.100 discovery: server-addr: ${spring.cloud.nacos.server-addr} username: ${spring.cloud.nacos.username} -- 2.47.2 From 5209f78513047ad5afa14b62f912f5f9dc039192 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Wed, 7 May 2025 23:03:38 +0800 Subject: [PATCH 04/44] =?UTF-8?q?refactor(cicd):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=B9=E5=90=8D=E7=A7=B0=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/{workflow => workflows}/deploy.test.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .gitea/{workflow => workflows}/deploy.test.yml (100%) diff --git a/.gitea/workflow/deploy.test.yml b/.gitea/workflows/deploy.test.yml similarity index 100% rename from .gitea/workflow/deploy.test.yml rename to .gitea/workflows/deploy.test.yml -- 2.47.2 From 05bc48cb55bf51d3b87cbf6ef9f9e43392a52c7e Mon Sep 17 00:00:00 2001 From: gewuyou Date: Thu, 8 May 2025 10:11:42 +0800 Subject: [PATCH 05/44] =?UTF-8?q?build:=20=E6=9B=B4=E6=96=B0=20Maven=20?= =?UTF-8?q?=E4=BB=93=E5=BA=93=E5=B9=B6=E8=B0=83=E6=95=B4=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 注释掉 eurotech/kura_addons 的 Maven仓库 - 添加阿里云 Central Maven 仓库 - 移除注释中的 springbootWeb 相关配置 - 优化 jib配置,调整项目名称和端口设置 --- build.gradle.kts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 77531ba..0ee7ffc 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -33,12 +33,13 @@ allprojects { maven { url = uri("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev") } - maven { - url = uri("https://raw.githubusercontent.com/eurotech/kura_addons/mvn-repo/") - } +// maven { +// url = uri("https://raw.githubusercontent.com/eurotech/kura_addons/mvn-repo/") +// } maven { url = uri("https://maven.aliyun.com/repository/public/") } + maven { url = uri("https://maven.aliyun.com/repository/central") } maven { url = uri("https://maven.aliyun.com/repository/spring/") } @@ -66,7 +67,6 @@ allprojects { subprojects { afterEvaluate { - // springbootWeb // springbootWeb if (project.getPropertyByBoolean(ProjectFlags.USE_SPRING_BOOT_WEB)) { apply { @@ -107,7 +107,7 @@ subprojects { } } jibConfig { - val env=System.getenv("SPRING_PROFILES_ACTIVE") + val env = System.getenv("SPRING_PROFILES_ACTIVE") project { projectName = "llmx-core-service" ports = listOf("9002") @@ -115,11 +115,11 @@ subprojects { imageName = "llmx-core-service" // paths = listOf(File(rootProject.projectDir, "scripts").absolutePath) } - project{ - projectName="llmx-impl-bailian" - ports=listOf("9003") - environment=mapOf("SPRING_PROFILES_ACTIVE" to env) - imageName="llmx-impl-bailian" + project { + projectName = "llmx-impl-bailian" + ports = listOf("9003") + environment = mapOf("SPRING_PROFILES_ACTIVE" to env) + imageName = "llmx-impl-bailian" // paths = listOf(File(rootProject.projectDir, "scripts").absolutePath) } } -- 2.47.2 From cc03088927450da8090c583d844a8ffaf92fb34e Mon Sep 17 00:00:00 2001 From: gewuyou Date: Thu, 8 May 2025 10:36:32 +0800 Subject: [PATCH 06/44] =?UTF-8?q?ci:=20=E6=9B=B4=E6=96=B0=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在部署阶段添加了进入 docker 目录的步骤 - 这个改动确保了后续的部署操作在正确的目录下执行,避免了潜在的路径问题 --- .gitea/workflows/deploy.test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitea/workflows/deploy.test.yml b/.gitea/workflows/deploy.test.yml index c7446d9..c1716a3 100644 --- a/.gitea/workflows/deploy.test.yml +++ b/.gitea/workflows/deploy.test.yml @@ -104,6 +104,7 @@ jobs: # ========== 7. 部署阶段 ========== - name: 🔧 Prepare Deployment run: | + cd docker echo "准备部署环境..." chmod +x ${COMPOSE_FILE} echo "当前Docker状态:" -- 2.47.2 From 181070b5bc36c8d3bb0726c1cd80c3db40560c18 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Thu, 8 May 2025 11:35:09 +0800 Subject: [PATCH 07/44] =?UTF-8?q?ci:=20=E6=9B=B4=E6=96=B0=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E5=8F=98=E9=87=8F=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 REGISTRY_URL 环境变量名修改为 DOCKER_REGISTRY_URL - 此修改是为了适应 .env 文件中的变量名变更 --- .gitea/workflows/deploy.test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/deploy.test.yml b/.gitea/workflows/deploy.test.yml index c1716a3..27d20ae 100644 --- a/.gitea/workflows/deploy.test.yml +++ b/.gitea/workflows/deploy.test.yml @@ -7,7 +7,7 @@ on: env: # ========== 环境变量配置 ========== - REGISTRY_URL: ${{vars.REGISTRY_URL}} # 私有Docker镜像仓库地址 + DOCKER_REGISTRY_URL: ${{vars.DOCKER_REGISTRY_URL}} # 私有Docker镜像仓库地址 PROJECT_NAME: llmx # 项目名称 COMPOSE_FILE: docker-compose.test.yml # Docker compose文件路径 LUKE_SERVER_DOCKER_REGISTRY_PASSWORD: ${{ secrets.SERVER_PASSWORD }} # 仓库密码 -- 2.47.2 From 1ace055e37fadd1ec321cfd31eb9c842ea120627 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Thu, 8 May 2025 13:15:09 +0800 Subject: [PATCH 08/44] =?UTF-8?q?ci:=20=E6=9B=B4=E6=96=B0=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E5=8F=98=E9=87=8F=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 LUKE_SERVER_DOCKER_REGISTRY_PASSWORD 改为 SERVER_PASSWORD --- .gitea/workflows/deploy.test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/deploy.test.yml b/.gitea/workflows/deploy.test.yml index 27d20ae..8914aec 100644 --- a/.gitea/workflows/deploy.test.yml +++ b/.gitea/workflows/deploy.test.yml @@ -10,7 +10,7 @@ env: DOCKER_REGISTRY_URL: ${{vars.DOCKER_REGISTRY_URL}} # 私有Docker镜像仓库地址 PROJECT_NAME: llmx # 项目名称 COMPOSE_FILE: docker-compose.test.yml # Docker compose文件路径 - LUKE_SERVER_DOCKER_REGISTRY_PASSWORD: ${{ secrets.SERVER_PASSWORD }} # 仓库密码 + SERVER_PASSWORD: ${{ secrets.SERVER_PASSWORD }} # 仓库密码 JCNC_GITEA_URL: ${{vars.SERVER_GITEA_URL}} # Gitea地址 RUNNER_TOOL_CACHE: /opt/tools-cache # 工具缓存目录 GRADLE_CACHE_KEY: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} -- 2.47.2 From 383533eb35ce03de9e7d1e92a13b8b54ad8218b4 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Thu, 8 May 2025 14:39:02 +0800 Subject: [PATCH 09/44] =?UTF-8?q?refactor(llmx):=20=E5=B0=86=20LLMProvider?= =?UTF-8?q?=20=E6=8E=A5=E5=8F=A3=E4=B8=AD=E7=9A=84=20chat=20=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E8=BF=94=E5=9B=9E=E7=B1=BB=E5=9E=8B=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=20Publisher?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改了 LLMProvider 接口和 BaiLianProvider 实现类中的 chat 方法,将返回类型从 Flow 改为 Publisher,以适应 Spring WebFlux 的数据处理方式。这一变更使得系统能够更好地集成和使用 Spring WebFlux 的特性。 --- .../org/jcnc/llmx/core/spi/provider/LLMProvider.kt | 5 ++--- .../llmx/impl/baiLian/controller/BaiLianProvider.kt | 13 +++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/llmx-core/llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi/provider/LLMProvider.kt b/llmx-core/llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi/provider/LLMProvider.kt index 404c127..9af555b 100644 --- a/llmx-core/llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi/provider/LLMProvider.kt +++ b/llmx-core/llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi/provider/LLMProvider.kt @@ -1,12 +1,11 @@ package org.jcnc.llmx.core.spi.provider -import kotlinx.coroutines.flow.Flow import org.jcnc.llmx.core.spi.entities.request.ChatRequest import org.jcnc.llmx.core.spi.entities.request.EmbeddingRequest import org.jcnc.llmx.core.spi.entities.response.ChatResponsePart import org.jcnc.llmx.core.spi.entities.response.EmbeddingResponse +import org.reactivestreams.Publisher import org.springframework.http.MediaType - import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestMapping @@ -31,7 +30,7 @@ interface LLMProvider { * @return 返回一个Flow流,通过该流可以接收到聊天响应的部分数据,如消息、状态更新等 */ @PostMapping("/chat", produces = [MediaType.APPLICATION_NDJSON_VALUE]) - fun chat(request: ChatRequest): Flow + fun chat(request: ChatRequest): Publisher /** * 嵌入功能方法 diff --git a/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/controller/BaiLianProvider.kt b/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/controller/BaiLianProvider.kt index 028c275..e8a1e69 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/controller/BaiLianProvider.kt +++ b/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/controller/BaiLianProvider.kt @@ -1,16 +1,19 @@ package org.jcnc.llmx.impl.baiLian.controller -import kotlinx.coroutines.flow.Flow + +import kotlinx.coroutines.reactive.asPublisher import org.jcnc.llmx.core.spi.entities.request.ChatRequest import org.jcnc.llmx.core.spi.entities.request.EmbeddingRequest import org.jcnc.llmx.core.spi.entities.response.ChatResponsePart import org.jcnc.llmx.core.spi.entities.response.EmbeddingResponse import org.jcnc.llmx.core.spi.provider.LLMProvider import org.jcnc.llmx.impl.baiLian.service.BaiLianModelService +import org.reactivestreams.Publisher import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RestController + /** *百炼提供商 * @@ -18,10 +21,9 @@ import org.springframework.web.bind.annotation.RestController * @author gewuyou */ @RestController -//@RequestMapping("/provider") class BaiLianProvider( private val baiLianModelService: BaiLianModelService -): LLMProvider { +) : LLMProvider { /** * 初始化与聊天服务的连接,以处理聊天请求 * @@ -31,9 +33,8 @@ class BaiLianProvider( * @param request 聊天请求对象,包含建立聊天所需的信息,如用户标识、会话标识等 * @return 返回一个Flow流,通过该流可以接收到聊天响应的部分数据,如消息、状态更新等 */ -// @PostMapping("/chat") - override fun chat(@RequestBody request: ChatRequest): Flow { - return baiLianModelService.streamChat(request) + override fun chat(@RequestBody request: ChatRequest): Publisher { + return baiLianModelService.streamChat(request).asPublisher() } /** -- 2.47.2 From 7d71f4d32dba48d99ff3330b95c9fc3ad4676daa Mon Sep 17 00:00:00 2001 From: gewuyou Date: Thu, 8 May 2025 21:47:00 +0800 Subject: [PATCH 10/44] =?UTF-8?q?feat(core):=20=E6=96=B0=E5=A2=9E=E5=A4=9A?= =?UTF-8?q?=E6=A8=A1=E6=80=81=E8=81=8A=E5=A4=A9=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 llmx-core 中添加了多模态聊天相关的数据结构和接口 - 在 llmx-impl-bailian 中实现了多模态聊天的适配器和服务 - 新增了多模态聊天的控制器和相关配置- 重构了原有的聊天请求和响应结构,支持多模态内容 --- .gitea/workflows/deploy.test.yml | 2 +- build.gradle.kts | 6 + buildSrc/src/main/kotlin/Modules.kt | 2 + buildSrc/src/main/kotlin/ProjectFlags.kt | 1 + gradle/libs.versions.toml | 5 + gradlew | 2 +- llmx-app/.gitattributes | 3 + llmx-app/.gitignore | 40 ++++++ llmx-app/build.gradle.kts | 9 ++ .../llmx-app-multimodality/.gitattributes | 3 + llmx-app/llmx-app-multimodality/.gitignore | 40 ++++++ .../llmx-app-multimodality/build.gradle.kts | 13 ++ .../LlmxAppMultimodalityApplication.kt | 11 ++ .../src/main/resources/application-dev.yml | 8 ++ .../src/main/resources/application-master.yml | 0 .../src/main/resources/application-test.yml | 7 ++ .../src/main/resources/application.yml | 5 + .../src/main/resources/bootstrap-dev.yml | 12 ++ .../src/main/resources/bootstrap-test.yml | 10 ++ .../LlmxAppMultimodalityApplicationTests.kt | 13 ++ llmx-core/build.gradle.kts | 2 +- llmx-core/llmx-core-api/.gitattributes | 3 + llmx-core/llmx-core-api/.gitignore | 40 ++++++ llmx-core/llmx-core-api/build.gradle.kts | 10 ++ .../core/api/LLMCoreFeignAutoConfiguration.kt | 14 +++ .../jcnc/llmx/core/api/LLMCoreFeignClient.kt | 21 ++++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + llmx-core/llmx-core-common/.gitattributes | 3 + llmx-core/llmx-core-common/.gitignore | 40 ++++++ llmx-core/llmx-core-common/build.gradle.kts | 7 ++ .../MultiModalContentDeserializer.kt | 42 +++++++ .../common/entities/request/ChatRequest.kt | 52 ++++++++ .../entities/request/EmbeddingRequest.kt | 2 +- .../common}/entities/response/ChatResponse.kt | 2 +- .../entities/response/EmbeddingResponse.kt | 2 +- .../core/service/controller/ChatController.kt | 25 +++- .../llmx/core/service/service/LLMService.kt | 12 +- .../service/service/impl/LLMServiceImpl.kt | 21 +++- .../src/main/resources/application-dev.yml | 1 + .../src/main/resources/application-master.yml | 7 ++ .../src/main/resources/application-test.yml | 1 + llmx-core/llmx-core-spi/build.gradle.kts | 3 +- .../core/spi/entities/request/ChatRequest.kt | 17 --- .../llmx/core/spi/provider/LLMProvider.kt | 22 +++- .../impl/baiLian/adapter/DashScopeAdapter.kt | 10 +- .../config/entities/DashScopeProperties.kt | 4 + .../baiLian/controller/BaiLianProvider.kt | 13 +- .../entities/response/DashScopeResponse.kt | 117 ++++++++++++++++++ .../baiLian/service/BaiLianModelService.kt | 11 +- .../service/impl/BaiLianModelServiceImpl.kt | 79 +++++++++++- .../src/main/resources/application-dev.yml | 1 + .../src/main/resources/application-test.yml | 1 + .../com/gewuyou/bailian/util/Base64Image.java | 21 ++++ .../util/DashScopeLocalImageClient.java | 85 +++++++++++++ settings.gradle.kts | 14 ++- 55 files changed, 839 insertions(+), 59 deletions(-) create mode 100644 llmx-app/.gitattributes create mode 100644 llmx-app/.gitignore create mode 100644 llmx-app/build.gradle.kts create mode 100644 llmx-app/llmx-app-multimodality/.gitattributes create mode 100644 llmx-app/llmx-app-multimodality/.gitignore create mode 100644 llmx-app/llmx-app-multimodality/build.gradle.kts create mode 100644 llmx-app/llmx-app-multimodality/src/main/kotlin/org/jcnc/llmx/app/multimodality/LlmxAppMultimodalityApplication.kt create mode 100644 llmx-app/llmx-app-multimodality/src/main/resources/application-dev.yml rename llmx-core/llmx-core-service/src/main/resources/application-prod.yml => llmx-app/llmx-app-multimodality/src/main/resources/application-master.yml (100%) create mode 100644 llmx-app/llmx-app-multimodality/src/main/resources/application-test.yml create mode 100644 llmx-app/llmx-app-multimodality/src/main/resources/application.yml create mode 100644 llmx-app/llmx-app-multimodality/src/main/resources/bootstrap-dev.yml create mode 100644 llmx-app/llmx-app-multimodality/src/main/resources/bootstrap-test.yml create mode 100644 llmx-app/llmx-app-multimodality/src/test/kotlin/org/jcnc/llmx/app/multimodality/LlmxAppMultimodalityApplicationTests.kt create mode 100644 llmx-core/llmx-core-api/.gitattributes create mode 100644 llmx-core/llmx-core-api/.gitignore create mode 100644 llmx-core/llmx-core-api/build.gradle.kts create mode 100644 llmx-core/llmx-core-api/src/main/kotlin/org/jcnc/llmx/core/api/LLMCoreFeignAutoConfiguration.kt create mode 100644 llmx-core/llmx-core-api/src/main/kotlin/org/jcnc/llmx/core/api/LLMCoreFeignClient.kt create mode 100644 llmx-core/llmx-core-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 llmx-core/llmx-core-common/.gitattributes create mode 100644 llmx-core/llmx-core-common/.gitignore create mode 100644 llmx-core/llmx-core-common/build.gradle.kts create mode 100644 llmx-core/llmx-core-common/src/main/kotlin/org/jcnc/llmx/core/common/deserializer/MultiModalContentDeserializer.kt create mode 100644 llmx-core/llmx-core-common/src/main/kotlin/org/jcnc/llmx/core/common/entities/request/ChatRequest.kt rename llmx-core/{llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi => llmx-core-common/src/main/kotlin/org/jcnc/llmx/core/common}/entities/request/EmbeddingRequest.kt (90%) rename llmx-core/{llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi => llmx-core-common/src/main/kotlin/org/jcnc/llmx/core/common}/entities/response/ChatResponse.kt (95%) rename llmx-core/{llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi => llmx-core-common/src/main/kotlin/org/jcnc/llmx/core/common}/entities/response/EmbeddingResponse.kt (91%) create mode 100644 llmx-core/llmx-core-service/src/main/resources/application-master.yml delete mode 100644 llmx-core/llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi/entities/request/ChatRequest.kt create mode 100644 llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/entities/response/DashScopeResponse.kt create mode 100644 llmx-impl/llmx-impl-bailian/src/test/java/com/gewuyou/bailian/util/Base64Image.java create mode 100644 llmx-impl/llmx-impl-bailian/src/test/java/com/gewuyou/bailian/util/DashScopeLocalImageClient.java diff --git a/.gitea/workflows/deploy.test.yml b/.gitea/workflows/deploy.test.yml index 8914aec..5b922b8 100644 --- a/.gitea/workflows/deploy.test.yml +++ b/.gitea/workflows/deploy.test.yml @@ -79,7 +79,7 @@ jobs: ./gradlew jib --stacktrace --build-cache --info -Dorg.gradle.caching=true -Dorg.gradle.jvmargs="-Xmx2g -Xms2g -XX:MaxMetaspaceSize=1g" | tee build.log echo "=== 镜像构建结果 ===" - docker images | grep ${{env.PROJECT_NAME}} + docker images | grep ${{ env.PROJECT_NAME }} || true - name: 🛑 Stop Gradle Daemon run: | echo "停止Gradle守护进程..." diff --git a/build.gradle.kts b/build.gradle.kts index 0ee7ffc..a22d08a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -23,6 +23,7 @@ allprojects { set(ProjectFlags.USE_LLM_CORE_SPI, false) set(ProjectFlags.USE_SPRING_CLOUD_BOM, false) set(ProjectFlags.IS_ROOT_MODULE, false) + set(ProjectFlags.USE_SPRING_BOOT_BOM,false) } repositories { mavenLocal() @@ -93,6 +94,11 @@ subprojects { implementation(platform(libs.springCloudDependencies.bom)) } } + if(project.getPropertyByBoolean(ProjectFlags.USE_SPRING_BOOT_BOM)){ + dependencies { + implementation(platform(libs.springBootDependencies.bom)) + } + } } val libs = rootProject.libs apply { diff --git a/buildSrc/src/main/kotlin/Modules.kt b/buildSrc/src/main/kotlin/Modules.kt index dacb471..6b0d211 100644 --- a/buildSrc/src/main/kotlin/Modules.kt +++ b/buildSrc/src/main/kotlin/Modules.kt @@ -14,6 +14,8 @@ object Modules { object Core{ // llmx-core-spi模块的路径,用于定义核心功能的SPI const val SPI = ":llmx-core:llmx-core-spi" + const val API = ":llmx-core:llmx-core-api" + const val COMMON = ":llmx-core:llmx-core-common" } } diff --git a/buildSrc/src/main/kotlin/ProjectFlags.kt b/buildSrc/src/main/kotlin/ProjectFlags.kt index db93d4a..c00120c 100644 --- a/buildSrc/src/main/kotlin/ProjectFlags.kt +++ b/buildSrc/src/main/kotlin/ProjectFlags.kt @@ -1,5 +1,6 @@ object ProjectFlags { const val USE_SPRING_BOOT_WEB = "useSpringBootWeb" + const val USE_SPRING_BOOT_BOM = "useSpringBootBom" const val USE_SPRING_CLOUD_BOM = "useSpringCloudBom" const val USE_LLM_CORE_SPI = "useLLMCoreSPI" const val IS_ROOT_MODULE = "isRootModule" diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b965abb..d6c2bde 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,6 +8,7 @@ spring-cloud-starter-alibaba-nacos-discovery-version = "2023.0.1.0" forgeBoot-version = "1.1.0-SNAPSHOT" okHttp-version = "4.12.0" jib-version = "3.4.2" +org-reactivestreams-reactiveStreams-version = "1.0.4" [plugins] # 应用 Java 插件,提供基本的 Java 代码编译和构建能力 java = { id = "java" } @@ -31,6 +32,7 @@ jibLocalPlugin = { id = "org.jcnc.llmx.plugin.jib" } jib-gradlePlugin = { module = "com.google.cloud.tools.jib:com.google.cloud.tools.jib.gradle.plugin", version.ref = "jib-version" } # bom springCloudDependencies-bom = { group ="org.springframework.cloud",name = "spring-cloud-dependencies", version.ref = "spring-cloud-version" } +springBootDependencies-bom = { module = "org.springframework.boot:spring-boot-dependencies", version.ref = "spring-boot-version" } # kotlinx # 响应式协程库 kotlinx-coruntes-reactor = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-reactor" } @@ -41,6 +43,7 @@ aliyun-bailian = { group = "com.aliyun", name = "bailian20231229", version.ref = # SrpingCloud springCloudStarter-alibaba-nacos-discovery = { group = "com.alibaba.cloud", name = "spring-cloud-starter-alibaba-nacos-discovery", version.ref = "spring-cloud-starter-alibaba-nacos-discovery-version" } springCloudStarter-loadbalancer = { group = "org.springframework.cloud", name = "spring-cloud-starter-loadbalancer" } +springCloudStarter-openfeign = { group = "org.springframework.cloud", name = "spring-cloud-starter-openfeign" } # SpringBootStarter springBootStarter-webflux = { group = "org.springframework.boot", name = "spring-boot-starter-webflux" } @@ -49,6 +52,8 @@ springBootStarter-test = { group = "org.springframework.boot", name = "spring-bo junitPlatform-launcher = { group = "org.junit.platform", name = "junit-platform-launcher" } +# org-reactivestreams +org-reactivestreams-reactiveStreams = { group = "org.reactivestreams", name = "reactive-streams" ,version.ref="org-reactivestreams-reactiveStreams-version"} # OkHttp okHttp = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okHttp-version" } # forgeBoot diff --git a/gradlew b/gradlew index f3b75f3..e93a03e 100644 --- a/gradlew +++ b/gradlew @@ -207,7 +207,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: # * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. -# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# * For gewuyou: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. set -- \ diff --git a/llmx-app/.gitattributes b/llmx-app/.gitattributes new file mode 100644 index 0000000..8af972c --- /dev/null +++ b/llmx-app/.gitattributes @@ -0,0 +1,3 @@ +/gradlew text eol=lf +*.bat text eol=crlf +*.jar binary diff --git a/llmx-app/.gitignore b/llmx-app/.gitignore new file mode 100644 index 0000000..5a979af --- /dev/null +++ b/llmx-app/.gitignore @@ -0,0 +1,40 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Kotlin ### +.kotlin diff --git a/llmx-app/build.gradle.kts b/llmx-app/build.gradle.kts new file mode 100644 index 0000000..d1a1567 --- /dev/null +++ b/llmx-app/build.gradle.kts @@ -0,0 +1,9 @@ +dependencies { + +} +/** + * 由于 Kotlin 插件引入时会自动添加依赖,但根项目不需要 Kotlin 依赖,因此需要排除 Kotlin 依赖 + */ +configurations.implementation { + exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib") +} diff --git a/llmx-app/llmx-app-multimodality/.gitattributes b/llmx-app/llmx-app-multimodality/.gitattributes new file mode 100644 index 0000000..8af972c --- /dev/null +++ b/llmx-app/llmx-app-multimodality/.gitattributes @@ -0,0 +1,3 @@ +/gradlew text eol=lf +*.bat text eol=crlf +*.jar binary diff --git a/llmx-app/llmx-app-multimodality/.gitignore b/llmx-app/llmx-app-multimodality/.gitignore new file mode 100644 index 0000000..5a979af --- /dev/null +++ b/llmx-app/llmx-app-multimodality/.gitignore @@ -0,0 +1,40 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Kotlin ### +.kotlin diff --git a/llmx-app/llmx-app-multimodality/build.gradle.kts b/llmx-app/llmx-app-multimodality/build.gradle.kts new file mode 100644 index 0000000..af933bf --- /dev/null +++ b/llmx-app/llmx-app-multimodality/build.gradle.kts @@ -0,0 +1,13 @@ +extra { + // 开启springboot + setProperty(ProjectFlags.USE_SPRING_BOOT_WEB, true) + setProperty(ProjectFlags.USE_SPRING_CLOUD_BOM, true) +} +dependencies { + // Nacos 服务发现和配置 + implementation(libs.springCloudStarter.alibaba.nacos.discovery) + implementation(libs.forgeBoot.core.extension) + implementation(libs.forgeBoot.webmvc.version.springBootStarter) + implementation(libs.jackson.module.kotlin) + implementation(project(Modules.Core.API)) +} diff --git a/llmx-app/llmx-app-multimodality/src/main/kotlin/org/jcnc/llmx/app/multimodality/LlmxAppMultimodalityApplication.kt b/llmx-app/llmx-app-multimodality/src/main/kotlin/org/jcnc/llmx/app/multimodality/LlmxAppMultimodalityApplication.kt new file mode 100644 index 0000000..8133bab --- /dev/null +++ b/llmx-app/llmx-app-multimodality/src/main/kotlin/org/jcnc/llmx/app/multimodality/LlmxAppMultimodalityApplication.kt @@ -0,0 +1,11 @@ +package org.jcnc.llmx.app.multimodality + +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.runApplication + +@SpringBootApplication +class LlmxAppMultimodalityApplication + +fun main(args: Array) { + runApplication(*args) +} diff --git a/llmx-app/llmx-app-multimodality/src/main/resources/application-dev.yml b/llmx-app/llmx-app-multimodality/src/main/resources/application-dev.yml new file mode 100644 index 0000000..3360232 --- /dev/null +++ b/llmx-app/llmx-app-multimodality/src/main/resources/application-dev.yml @@ -0,0 +1,8 @@ +server: + port: 8081 +spring: + config: + import: classpath:bootstrap-dev.yml + + + diff --git a/llmx-core/llmx-core-service/src/main/resources/application-prod.yml b/llmx-app/llmx-app-multimodality/src/main/resources/application-master.yml similarity index 100% rename from llmx-core/llmx-core-service/src/main/resources/application-prod.yml rename to llmx-app/llmx-app-multimodality/src/main/resources/application-master.yml diff --git a/llmx-app/llmx-app-multimodality/src/main/resources/application-test.yml b/llmx-app/llmx-app-multimodality/src/main/resources/application-test.yml new file mode 100644 index 0000000..d75e277 --- /dev/null +++ b/llmx-app/llmx-app-multimodality/src/main/resources/application-test.yml @@ -0,0 +1,7 @@ +server: + port: 9003 +spring: + config: + import: classpath:bootstrap-test.yml + + diff --git a/llmx-app/llmx-app-multimodality/src/main/resources/application.yml b/llmx-app/llmx-app-multimodality/src/main/resources/application.yml new file mode 100644 index 0000000..9c9db5f --- /dev/null +++ b/llmx-app/llmx-app-multimodality/src/main/resources/application.yml @@ -0,0 +1,5 @@ +spring: + application: + name: llmx-app-multimodality + profiles: + active: dev diff --git a/llmx-app/llmx-app-multimodality/src/main/resources/bootstrap-dev.yml b/llmx-app/llmx-app-multimodality/src/main/resources/bootstrap-dev.yml new file mode 100644 index 0000000..37654f9 --- /dev/null +++ b/llmx-app/llmx-app-multimodality/src/main/resources/bootstrap-dev.yml @@ -0,0 +1,12 @@ +spring: + cloud: + nacos: + username: nacos + password: L4s6f9y3 + server-addr: 49.235.96.75:8848 + ip: 192.168.1.100 + discovery: + server-addr: ${spring.cloud.nacos.server-addr} + username: ${spring.cloud.nacos.username} + password: ${spring.cloud.nacos.password} + ip: ${spring.cloud.nacos.ip} \ No newline at end of file diff --git a/llmx-app/llmx-app-multimodality/src/main/resources/bootstrap-test.yml b/llmx-app/llmx-app-multimodality/src/main/resources/bootstrap-test.yml new file mode 100644 index 0000000..c9dc5c7 --- /dev/null +++ b/llmx-app/llmx-app-multimodality/src/main/resources/bootstrap-test.yml @@ -0,0 +1,10 @@ +spring: + cloud: + nacos: + username: nacos + password: L4s6f9y3 + server-addr: 49.235.96.75:9001 + discovery: + server-addr: ${spring.cloud.nacos.server-addr} + username: ${spring.cloud.nacos.username} + password: ${spring.cloud.nacos.password} \ No newline at end of file diff --git a/llmx-app/llmx-app-multimodality/src/test/kotlin/org/jcnc/llmx/app/multimodality/LlmxAppMultimodalityApplicationTests.kt b/llmx-app/llmx-app-multimodality/src/test/kotlin/org/jcnc/llmx/app/multimodality/LlmxAppMultimodalityApplicationTests.kt new file mode 100644 index 0000000..98e9d18 --- /dev/null +++ b/llmx-app/llmx-app-multimodality/src/test/kotlin/org/jcnc/llmx/app/multimodality/LlmxAppMultimodalityApplicationTests.kt @@ -0,0 +1,13 @@ +package org.jcnc.llmx.app.multimodality + +import org.junit.jupiter.api.Test +import org.springframework.boot.test.context.SpringBootTest + +@SpringBootTest +class LlmxAppMultimodalityApplicationTests { + + @Test + fun contextLoads() { + } + +} diff --git a/llmx-core/build.gradle.kts b/llmx-core/build.gradle.kts index e972465..d1a1567 100644 --- a/llmx-core/build.gradle.kts +++ b/llmx-core/build.gradle.kts @@ -2,7 +2,7 @@ dependencies { } /** - * 由于 Kotlin 插件被引入时会自动添加依赖,但根项目不需要 Kotlin 依赖,因此需要排除 Kotlin 依赖 + * 由于 Kotlin 插件引入时会自动添加依赖,但根项目不需要 Kotlin 依赖,因此需要排除 Kotlin 依赖 */ configurations.implementation { exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib") diff --git a/llmx-core/llmx-core-api/.gitattributes b/llmx-core/llmx-core-api/.gitattributes new file mode 100644 index 0000000..8af972c --- /dev/null +++ b/llmx-core/llmx-core-api/.gitattributes @@ -0,0 +1,3 @@ +/gradlew text eol=lf +*.bat text eol=crlf +*.jar binary diff --git a/llmx-core/llmx-core-api/.gitignore b/llmx-core/llmx-core-api/.gitignore new file mode 100644 index 0000000..5a979af --- /dev/null +++ b/llmx-core/llmx-core-api/.gitignore @@ -0,0 +1,40 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Kotlin ### +.kotlin diff --git a/llmx-core/llmx-core-api/build.gradle.kts b/llmx-core/llmx-core-api/build.gradle.kts new file mode 100644 index 0000000..ccff2b8 --- /dev/null +++ b/llmx-core/llmx-core-api/build.gradle.kts @@ -0,0 +1,10 @@ +ext{ + set(ProjectFlags.USE_SPRING_CLOUD_BOM,true) +} +dependencies { + api(project(Modules.Core.COMMON)) + api(libs.org.reactivestreams.reactiveStreams) + // Spring Cloud OpenFeign + implementation(libs.springCloudStarter.openfeign) +} + diff --git a/llmx-core/llmx-core-api/src/main/kotlin/org/jcnc/llmx/core/api/LLMCoreFeignAutoConfiguration.kt b/llmx-core/llmx-core-api/src/main/kotlin/org/jcnc/llmx/core/api/LLMCoreFeignAutoConfiguration.kt new file mode 100644 index 0000000..54052b2 --- /dev/null +++ b/llmx-core/llmx-core-api/src/main/kotlin/org/jcnc/llmx/core/api/LLMCoreFeignAutoConfiguration.kt @@ -0,0 +1,14 @@ +package org.jcnc.llmx.core.api + +import org.springframework.cloud.openfeign.EnableFeignClients +import org.springframework.context.annotation.Configuration + +/** + *LLM 核心Feign自动配置 + * + * @since 2025-05-08 16:48:23 + * @author gewuyou + */ +@Configuration +@EnableFeignClients(basePackages = ["org.jcnc.llmx.core.api"]) +open class LLMCoreFeignAutoConfiguration \ No newline at end of file diff --git a/llmx-core/llmx-core-api/src/main/kotlin/org/jcnc/llmx/core/api/LLMCoreFeignClient.kt b/llmx-core/llmx-core-api/src/main/kotlin/org/jcnc/llmx/core/api/LLMCoreFeignClient.kt new file mode 100644 index 0000000..f1257b3 --- /dev/null +++ b/llmx-core/llmx-core-api/src/main/kotlin/org/jcnc/llmx/core/api/LLMCoreFeignClient.kt @@ -0,0 +1,21 @@ +package org.jcnc.llmx.core.api + +import org.jcnc.llmx.core.common.entities.request.ChatRequest +import org.jcnc.llmx.core.common.entities.response.ChatResponsePart +import org.reactivestreams.Publisher +import org.springframework.cloud.openfeign.FeignClient +import org.springframework.http.MediaType +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody + +/** + *LLM 核心客户端 + * + * @since 2025-05-08 16:22:22 + * @author gewuyou + */ +@FeignClient(name = "llmx-core-service") // name 对应 Nacos 中注册的服务名 +fun interface LLMCoreFeignClient { + @PostMapping("/api/v1/chat/stream", consumes = [MediaType.APPLICATION_JSON_VALUE]) + fun chat(@RequestBody request: ChatRequest): Publisher +} \ No newline at end of file diff --git a/llmx-core/llmx-core-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/llmx-core/llmx-core-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..4b731f2 --- /dev/null +++ b/llmx-core/llmx-core-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +org.jcnc.llmx.core.api.LLMCoreFeignAutoConfiguration \ No newline at end of file diff --git a/llmx-core/llmx-core-common/.gitattributes b/llmx-core/llmx-core-common/.gitattributes new file mode 100644 index 0000000..8af972c --- /dev/null +++ b/llmx-core/llmx-core-common/.gitattributes @@ -0,0 +1,3 @@ +/gradlew text eol=lf +*.bat text eol=crlf +*.jar binary diff --git a/llmx-core/llmx-core-common/.gitignore b/llmx-core/llmx-core-common/.gitignore new file mode 100644 index 0000000..5a979af --- /dev/null +++ b/llmx-core/llmx-core-common/.gitignore @@ -0,0 +1,40 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Kotlin ### +.kotlin diff --git a/llmx-core/llmx-core-common/build.gradle.kts b/llmx-core/llmx-core-common/build.gradle.kts new file mode 100644 index 0000000..f9b855f --- /dev/null +++ b/llmx-core/llmx-core-common/build.gradle.kts @@ -0,0 +1,7 @@ +ext{ + set(ProjectFlags.USE_SPRING_BOOT_BOM,true) +} +dependencies { + implementation(libs.jackson.core) + implementation(libs.jackson.module.kotlin) +} diff --git a/llmx-core/llmx-core-common/src/main/kotlin/org/jcnc/llmx/core/common/deserializer/MultiModalContentDeserializer.kt b/llmx-core/llmx-core-common/src/main/kotlin/org/jcnc/llmx/core/common/deserializer/MultiModalContentDeserializer.kt new file mode 100644 index 0000000..d12674f --- /dev/null +++ b/llmx-core/llmx-core-common/src/main/kotlin/org/jcnc/llmx/core/common/deserializer/MultiModalContentDeserializer.kt @@ -0,0 +1,42 @@ +package org.jcnc.llmx.core.common.deserializer + +import com.fasterxml.jackson.core.JsonParser +import com.fasterxml.jackson.databind.DeserializationContext +import com.fasterxml.jackson.databind.JsonDeserializer +import com.fasterxml.jackson.databind.node.ObjectNode +import org.jcnc.llmx.core.common.entities.request.MultiModalContent + +/** + * 多模态内容反序列化器 + * + * 该类用于将JSON表示的多模态内容反序列化为MultiModalContent数据结构 + * 主要处理两种情况:文本内容和图像内容,并相应地创建Text或Image实例 + * 如果JSON中不包含已知的内容类型,则抛出IllegalArgumentException + * + * @since 2025-05-08 20:41:15 + * @author gewuyou + */ +class MultiModalContentDeserializer : JsonDeserializer() { + /** + * 反序列化方法 + * + * 根据JSON节点中的内容类型,创建相应的MultiModalContent实例 + * 如果内容类型未知,则抛出异常 + * + * @param p JsonParser对象,用于解析JSON输入 + * @param ctxt DeserializationContext对象,提供反序列化上下文 + * @return MultiModalContent实例,表示反序列化的多模态内容 + * @throws IllegalArgumentException 如果JSON节点中的内容类型未知 + */ + override fun deserialize(p: JsonParser, ctxt: DeserializationContext): MultiModalContent { + // 解析JSON输入并将其读取为ObjectNode + val node: ObjectNode = p.codec.readTree(p) + + // 根据JSON节点中的内容类型,返回相应的MultiModalContent实例 + return when { + node.has("text") -> MultiModalContent.Text(node["text"].asText()) + node.has("image") -> MultiModalContent.Image(node["image"].asText()) + else -> throw IllegalArgumentException("Unknown content type in: $node") + } + } +} diff --git a/llmx-core/llmx-core-common/src/main/kotlin/org/jcnc/llmx/core/common/entities/request/ChatRequest.kt b/llmx-core/llmx-core-common/src/main/kotlin/org/jcnc/llmx/core/common/entities/request/ChatRequest.kt new file mode 100644 index 0000000..28be69d --- /dev/null +++ b/llmx-core/llmx-core-common/src/main/kotlin/org/jcnc/llmx/core/common/entities/request/ChatRequest.kt @@ -0,0 +1,52 @@ +package org.jcnc.llmx.core.common.entities.request + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize +import org.jcnc.llmx.core.common.deserializer.MultiModalContentDeserializer + +/** + * MultiModalContent密封类,用于定义消息内容的多种模态 + * 这是一个密封类,意味着所有的子类都需要在这个文件中定义 + */ +@JsonDeserialize(using = MultiModalContentDeserializer::class) +sealed class MultiModalContent { + /** + * Text数据类,表示文本内容的模态 + * @param text 具体的文本内容 + */ + data class Text(val text: String) : MultiModalContent() + + /** + * Image数据类,表示图像内容的模态 + * @param image 图像的base64 + */ + data class Image(val image: String) : MultiModalContent() +} + +/** + * ChatRequest数据类,用于封装聊天请求的参数 + * @since 2025-04-25 17:07:02 + * @author gewuyou + * @param prompt 用户的聊天提示或消息,是聊天请求的主要输入 + * @param model 使用的聊天模型名称,决定了解析和响应的方式 + * @param messages 包含多个模态消息的列表,每个消息有特定的角色和内容 + * @param options 可选的额外参数集合,用于定制聊天请求的行为和输出 + * 可以包括如最大回复长度、温度(随机性)等 + */ +data class ChatRequest( + val prompt: String? = "", + val model: String, + val messages: List =listOf(), + val options: Map = mapOf() +) + +/** + * MultiModalMessage数据类,用于定义聊天请求中的单个消息 + * @param role 消息的角色,可以是"system", "user", "assistant"等 + * @param content 消息的内容,可以是文本、图像等多种模态的组合 + */ +data class MultiModalMessage( + val role: String, // "system", "user", "assistant" + val content: List +) + + diff --git a/llmx-core/llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi/entities/request/EmbeddingRequest.kt b/llmx-core/llmx-core-common/src/main/kotlin/org/jcnc/llmx/core/common/entities/request/EmbeddingRequest.kt similarity index 90% rename from llmx-core/llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi/entities/request/EmbeddingRequest.kt rename to llmx-core/llmx-core-common/src/main/kotlin/org/jcnc/llmx/core/common/entities/request/EmbeddingRequest.kt index d30ea3d..6a9603f 100644 --- a/llmx-core/llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi/entities/request/EmbeddingRequest.kt +++ b/llmx-core/llmx-core-common/src/main/kotlin/org/jcnc/llmx/core/common/entities/request/EmbeddingRequest.kt @@ -1,4 +1,4 @@ -package org.jcnc.llmx.core.spi.entities.request +package org.jcnc.llmx.core.common.entities.request /** * 嵌入请求类 diff --git a/llmx-core/llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi/entities/response/ChatResponse.kt b/llmx-core/llmx-core-common/src/main/kotlin/org/jcnc/llmx/core/common/entities/response/ChatResponse.kt similarity index 95% rename from llmx-core/llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi/entities/response/ChatResponse.kt rename to llmx-core/llmx-core-common/src/main/kotlin/org/jcnc/llmx/core/common/entities/response/ChatResponse.kt index f0ca30c..4fb9730 100644 --- a/llmx-core/llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi/entities/response/ChatResponse.kt +++ b/llmx-core/llmx-core-common/src/main/kotlin/org/jcnc/llmx/core/common/entities/response/ChatResponse.kt @@ -1,4 +1,4 @@ -package org.jcnc.llmx.core.spi.entities.response +package org.jcnc.llmx.core.common.entities.response /** * 聊天响应类 diff --git a/llmx-core/llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi/entities/response/EmbeddingResponse.kt b/llmx-core/llmx-core-common/src/main/kotlin/org/jcnc/llmx/core/common/entities/response/EmbeddingResponse.kt similarity index 91% rename from llmx-core/llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi/entities/response/EmbeddingResponse.kt rename to llmx-core/llmx-core-common/src/main/kotlin/org/jcnc/llmx/core/common/entities/response/EmbeddingResponse.kt index fa60996..09ee7c8 100644 --- a/llmx-core/llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi/entities/response/EmbeddingResponse.kt +++ b/llmx-core/llmx-core-common/src/main/kotlin/org/jcnc/llmx/core/common/entities/response/EmbeddingResponse.kt @@ -1,4 +1,4 @@ -package org.jcnc.llmx.core.spi.entities.response +package org.jcnc.llmx.core.common.entities.response /** * 嵌入响应类 diff --git a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/controller/ChatController.kt b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/controller/ChatController.kt index bf3570a..e905147 100644 --- a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/controller/ChatController.kt +++ b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/controller/ChatController.kt @@ -1,10 +1,12 @@ package org.jcnc.llmx.core.service.controller +import com.gewuyou.forgeboot.core.extension.log import com.gewuyou.forgeboot.webmvc.version.annotation.ApiVersion -import kotlinx.coroutines.flow.Flow +import org.jcnc.llmx.core.common.entities.request.ChatRequest +import org.jcnc.llmx.core.common.entities.response.ChatResponsePart import org.jcnc.llmx.core.service.service.impl.LLMServiceImpl -import org.jcnc.llmx.core.spi.entities.request.ChatRequest -import org.jcnc.llmx.core.spi.entities.response.ChatResponsePart + +import org.reactivestreams.Publisher import org.springframework.http.MediaType import org.springframework.web.bind.annotation.PostMapping @@ -35,7 +37,22 @@ class ChatController( * @return 返回一个Flow流,流中依次提供了聊天响应的部分数据,允许异步处理和逐步消费响应内容 */ @PostMapping("/stream", produces = [MediaType.APPLICATION_NDJSON_VALUE]) - fun chat(@RequestBody request: ChatRequest): Flow { + fun chat(@RequestBody request: ChatRequest): Publisher { return llmServiceImpl.chat(request) } + /** + * 处理多模态聊天请求的函数 + * 该函数通过 POST 方法接收一个聊天请求,并以 NDJSON 的形式返回聊天响应的部分 + * + * @param request 包含聊天请求信息的数据类 + * @return 返回一个发布者,用于异步地发送聊天响应的部分 + * + * 注意:该函数被设计为异步处理,以提高性能和响应性 + * 它使用了响应式编程模型,适合处理高并发和大数据量的响应 + */ + @PostMapping("/streamMultimodality", produces = [MediaType.APPLICATION_NDJSON_VALUE]) + fun multimodalityChat(@RequestBody request: ChatRequest): Publisher{ + log.info("request: {}", request) + return llmServiceImpl.multimodalityChat(request) + } } \ No newline at end of file diff --git a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/service/LLMService.kt b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/service/LLMService.kt index badf32f..bd0ae6f 100644 --- a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/service/LLMService.kt +++ b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/service/LLMService.kt @@ -1,8 +1,9 @@ package org.jcnc.llmx.core.service.service -import kotlinx.coroutines.flow.Flow -import org.jcnc.llmx.core.spi.entities.request.ChatRequest -import org.jcnc.llmx.core.spi.entities.response.ChatResponsePart + +import org.jcnc.llmx.core.common.entities.request.ChatRequest +import org.jcnc.llmx.core.common.entities.response.ChatResponsePart +import org.reactivestreams.Publisher import org.springframework.web.bind.annotation.PostMapping @@ -12,7 +13,7 @@ import org.springframework.web.bind.annotation.PostMapping * @since 2025-04-26 17:38:18 * @author gewuyou */ -fun interface LLMService { +interface LLMService { /** * 初始化与聊天服务的连接,以处理聊天请求 * @@ -23,5 +24,6 @@ fun interface LLMService { * @return 返回一个Flow流,通过该流可以接收到聊天响应的部分数据,如消息、状态更新等 */ @PostMapping("/chat") - fun chat(request: ChatRequest): Flow + fun chat(request: ChatRequest): Publisher + fun multimodalityChat(request: ChatRequest): Publisher } \ No newline at end of file diff --git a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/service/impl/LLMServiceImpl.kt b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/service/impl/LLMServiceImpl.kt index cdf45d8..2222156 100644 --- a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/service/impl/LLMServiceImpl.kt +++ b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/service/impl/LLMServiceImpl.kt @@ -1,11 +1,11 @@ package org.jcnc.llmx.core.service.service.impl -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.reactive.asFlow + +import org.jcnc.llmx.core.common.entities.request.ChatRequest +import org.jcnc.llmx.core.common.entities.response.ChatResponsePart import org.jcnc.llmx.core.service.manager.ModelRouteManager import org.jcnc.llmx.core.service.service.LLMService -import org.jcnc.llmx.core.spi.entities.request.ChatRequest -import org.jcnc.llmx.core.spi.entities.response.ChatResponsePart +import org.reactivestreams.Publisher import org.springframework.stereotype.Service import org.springframework.web.reactive.function.client.WebClient @@ -30,7 +30,7 @@ class LLMServiceImpl( * @param request 聊天请求对象,包含建立聊天所需的信息,如用户标识、会话标识等 * @return 返回一个Flow流,通过该流可以接收到聊天响应的部分数据,如消息、状态更新等 */ - override fun chat(request: ChatRequest): Flow { + override fun chat(request: ChatRequest): Publisher { val serviceName = modelRouteManager.resolveServiceName(request.model) val webClient = webClientBuilder.build() return webClient.post() @@ -38,6 +38,15 @@ class LLMServiceImpl( .bodyValue(request) .retrieve() .bodyToFlux(ChatResponsePart::class.java) - .asFlow() + } + + override fun multimodalityChat(request: ChatRequest): Publisher { + val serviceName = modelRouteManager.resolveServiceName(request.model) + val webClient = webClientBuilder.build() + return webClient.post() + .uri("http://$serviceName/provider/multimodalityChat") + .bodyValue(request) + .retrieve() + .bodyToFlux(ChatResponsePart::class.java) } } \ No newline at end of file diff --git a/llmx-core/llmx-core-service/src/main/resources/application-dev.yml b/llmx-core/llmx-core-service/src/main/resources/application-dev.yml index 4eb3cbd..d5844fb 100644 --- a/llmx-core/llmx-core-service/src/main/resources/application-dev.yml +++ b/llmx-core/llmx-core-service/src/main/resources/application-dev.yml @@ -9,5 +9,6 @@ llmx: qwen-turbo: llmx-impl-baiLian qwen-max: llmx-impl-baiLian qwen-plus: llmx-impl-baiLian + qwen-vl-max-latest: llmx-impl-baiLian diff --git a/llmx-core/llmx-core-service/src/main/resources/application-master.yml b/llmx-core/llmx-core-service/src/main/resources/application-master.yml new file mode 100644 index 0000000..e78b1c6 --- /dev/null +++ b/llmx-core/llmx-core-service/src/main/resources/application-master.yml @@ -0,0 +1,7 @@ +server: + port: 9002 +spring: + cloud: + nacos: + discovery: + server-addr: 49.235.96.75:9001 \ No newline at end of file diff --git a/llmx-core/llmx-core-service/src/main/resources/application-test.yml b/llmx-core/llmx-core-service/src/main/resources/application-test.yml index 0eca13f..e9166e1 100644 --- a/llmx-core/llmx-core-service/src/main/resources/application-test.yml +++ b/llmx-core/llmx-core-service/src/main/resources/application-test.yml @@ -9,5 +9,6 @@ llmx: qwen-turbo: llmx-impl-baiLian qwen-max: llmx-impl-baiLian qwen-plus: llmx-impl-baiLian + qwen-vl-max-latest: llmx-impl-baiLian diff --git a/llmx-core/llmx-core-spi/build.gradle.kts b/llmx-core/llmx-core-spi/build.gradle.kts index 923d5d7..8821f83 100644 --- a/llmx-core/llmx-core-spi/build.gradle.kts +++ b/llmx-core/llmx-core-spi/build.gradle.kts @@ -4,6 +4,7 @@ apply { plugin(libs.plugins.kotlin.plugin.spring.get().pluginId) } dependencies { - compileOnly(libs.kotlinx.coruntes.reactor) compileOnly(libs.springBootStarter.web) + api(libs.org.reactivestreams.reactiveStreams) + api(project(Modules.Core.COMMON)) } \ No newline at end of file diff --git a/llmx-core/llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi/entities/request/ChatRequest.kt b/llmx-core/llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi/entities/request/ChatRequest.kt deleted file mode 100644 index ada4e27..0000000 --- a/llmx-core/llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi/entities/request/ChatRequest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package org.jcnc.llmx.core.spi.entities.request - - -/** - * ChatRequest数据类,用于封装聊天请求的参数 - * @since 2025-04-25 17:07:02 - * @author gewuyou - * @param prompt 用户的聊天提示或消息,是聊天请求的主要输入 - * @param model 使用的聊天模型名称,决定了解析和响应的方式 - * @param options 可选的额外参数集合,用于定制聊天请求的行为和输出 - * 可以包括如最大回复长度、温度(随机性)等 - */ -data class ChatRequest( - val prompt: String, - val model: String, - val options: Map = mapOf() -) diff --git a/llmx-core/llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi/provider/LLMProvider.kt b/llmx-core/llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi/provider/LLMProvider.kt index 9af555b..69c41fb 100644 --- a/llmx-core/llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi/provider/LLMProvider.kt +++ b/llmx-core/llmx-core-spi/src/main/kotlin/org/jcnc/llmx/core/spi/provider/LLMProvider.kt @@ -1,9 +1,10 @@ package org.jcnc.llmx.core.spi.provider -import org.jcnc.llmx.core.spi.entities.request.ChatRequest -import org.jcnc.llmx.core.spi.entities.request.EmbeddingRequest -import org.jcnc.llmx.core.spi.entities.response.ChatResponsePart -import org.jcnc.llmx.core.spi.entities.response.EmbeddingResponse + +import org.jcnc.llmx.core.common.entities.request.ChatRequest +import org.jcnc.llmx.core.common.entities.request.EmbeddingRequest +import org.jcnc.llmx.core.common.entities.response.ChatResponsePart +import org.jcnc.llmx.core.common.entities.response.EmbeddingResponse import org.reactivestreams.Publisher import org.springframework.http.MediaType import org.springframework.web.bind.annotation.PostMapping @@ -31,7 +32,18 @@ interface LLMProvider { */ @PostMapping("/chat", produces = [MediaType.APPLICATION_NDJSON_VALUE]) fun chat(request: ChatRequest): Publisher - + /** + * 处理多模态聊天请求的函数 + * 该函数通过 POST 方法接收一个聊天请求,并以 NDJSON 的形式返回聊天响应的部分 + * + * @param request 包含聊天请求信息的数据类 + * @return 返回一个发布者,用于异步地发送聊天响应的部分 + * + * 注意:该函数被设计为异步处理,以提高性能和响应性 + * 它使用了响应式编程模型,适合处理高并发和大数据量的响应 + */ + @PostMapping("/multimodalityChat", produces = [MediaType.APPLICATION_NDJSON_VALUE]) + fun multimodalityChat(request: ChatRequest): Publisher /** * 嵌入功能方法 * 该方法允许用户发送嵌入请求,以获取LLM生成的嵌入向量 diff --git a/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/adapter/DashScopeAdapter.kt b/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/adapter/DashScopeAdapter.kt index 64e229a..1d83300 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/adapter/DashScopeAdapter.kt +++ b/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/adapter/DashScopeAdapter.kt @@ -11,7 +11,8 @@ import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody.Companion.toRequestBody -import org.jcnc.llmx.core.spi.entities.response.ChatResponsePart +import org.jcnc.llmx.core.common.entities.response.ChatResponsePart + import org.springframework.stereotype.Component import java.io.BufferedReader @@ -30,7 +31,7 @@ import java.io.BufferedReader @Component class DashScopeAdapter( private val okHttpClient: OkHttpClient, - private val objectMapper: ObjectMapper + private val objectMapper: ObjectMapper, ) { /** * 发送流式聊天请求 @@ -50,7 +51,7 @@ class DashScopeAdapter( headers: Map, requestBody: Any, extractContent: (String) -> ChatResponsePart, - dispatcher: CoroutineDispatcher = Dispatchers.IO + dispatcher: CoroutineDispatcher = Dispatchers.IO, ): Flow = flow { val requestJson = objectMapper.writeValueAsString(requestBody) log.info("📤 请求参数: {}", requestJson) @@ -59,6 +60,7 @@ class DashScopeAdapter( okHttpClient.newCall(request).execute().use { response -> if (!response.isSuccessful) { + log.error("🚨 DashScope 请求失败: code ${response.code} message: ${response.message} body: ${response.body}") throw RuntimeException("❌ DashScope 请求失败: HTTP ${response.code}") } @@ -92,7 +94,7 @@ class DashScopeAdapter( dispatcher: CoroutineDispatcher, reader: BufferedReader, extractContent: (String) -> ChatResponsePart, - allContent: StringBuilder + allContent: StringBuilder, ) { while (currentCoroutineContext().isActive) { val line = withContext(dispatcher) { diff --git a/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/config/entities/DashScopeProperties.kt b/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/config/entities/DashScopeProperties.kt index 608d3b5..7b79431 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/config/entities/DashScopeProperties.kt +++ b/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/config/entities/DashScopeProperties.kt @@ -44,5 +44,9 @@ class DashScopeProperties { * 应用调用基路径,例如 /api/v1。 */ var baseUrl: String = "" + /** + * 多模态对话调用路径 + */ + var multimodalityUrl: String = "" } diff --git a/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/controller/BaiLianProvider.kt b/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/controller/BaiLianProvider.kt index e8a1e69..039502e 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/controller/BaiLianProvider.kt +++ b/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/controller/BaiLianProvider.kt @@ -2,10 +2,11 @@ package org.jcnc.llmx.impl.baiLian.controller import kotlinx.coroutines.reactive.asPublisher -import org.jcnc.llmx.core.spi.entities.request.ChatRequest -import org.jcnc.llmx.core.spi.entities.request.EmbeddingRequest -import org.jcnc.llmx.core.spi.entities.response.ChatResponsePart -import org.jcnc.llmx.core.spi.entities.response.EmbeddingResponse +import org.jcnc.llmx.core.common.entities.request.ChatRequest +import org.jcnc.llmx.core.common.entities.request.EmbeddingRequest +import org.jcnc.llmx.core.common.entities.response.ChatResponsePart +import org.jcnc.llmx.core.common.entities.response.EmbeddingResponse + import org.jcnc.llmx.core.spi.provider.LLMProvider import org.jcnc.llmx.impl.baiLian.service.BaiLianModelService import org.reactivestreams.Publisher @@ -37,6 +38,10 @@ class BaiLianProvider( return baiLianModelService.streamChat(request).asPublisher() } + override fun multimodalityChat(@RequestBody request: ChatRequest): Publisher { + return baiLianModelService.streamMultimodalityChat(request).asPublisher() + } + /** * 嵌入功能方法 * 该方法允许用户发送嵌入请求,以获取LLM生成的嵌入向量 diff --git a/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/entities/response/DashScopeResponse.kt b/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/entities/response/DashScopeResponse.kt new file mode 100644 index 0000000..8c7c907 --- /dev/null +++ b/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/entities/response/DashScopeResponse.kt @@ -0,0 +1,117 @@ +package org.jcnc.llmx.impl.baiLian.entities.response + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties +import com.fasterxml.jackson.annotation.JsonProperty + +/** + * Dash范围响应类 + * + * 该类用于表示从Dash服务接收到的响应数据结构它包含了响应的输出信息、使用情况和请求ID + * 主要用于JSON序列化和反序列化 + * + * @param output 输出信息,包括生成的内容和完成原因 + * @param usage 使用情况,包括输入和输出的令牌详情 + * @param requestId 请求ID,用于跟踪和调试请求 + */ +@JsonIgnoreProperties(ignoreUnknown = true) +data class DashScopeResponse( + val output: Output?, + val usage: Usage?, + @JsonProperty("request_id") + val requestId: String? +) + +/** + * 输出数据类 + * + * 该类包含Dash服务生成的内容,主要是通过choices列表来提供可能的回复选项 + * + * @param choices 生成内容的选项列表 + */ +@JsonIgnoreProperties(ignoreUnknown = true) +data class Output( + val choices: List? +) + +/** + * 选择项数据类 + * + * 该类表示生成内容的一个选项,包括完成原因和具体的消息内容 + * + * @param finishReason 完成原因,解释生成内容结束的原因 + * @param message 消息内容,包括角色和具体内容 + */ +@JsonIgnoreProperties(ignoreUnknown = true) +data class Choice( + @JsonProperty("finish_reason") + val finishReason: String?, + val message: Message? +) + +/** + * 消息数据类 + * + * 该类表示一条消息,包括消息的角色(如用户、助手)和具体内容 + * 具体内容通过一个内容列表来表示 + * + * @param role 消息的角色,如用户、助手等 + * @param content 消息的具体内容列表 + */ +@JsonIgnoreProperties(ignoreUnknown = true) +data class Message( + val role: String?, + val content: List? +) + +/** + * 内容数据类 + * + * 该类表示消息中的具体内容,目前只支持文本内容 + * + * @param text 文本内容 + */ +@JsonIgnoreProperties(ignoreUnknown = true) +data class Content( + val text: String? +) + +/** + * 使用情况数据类 + * + * 该类详细记录了Dash服务的使用情况,包括输入和输出的令牌数量和详情 + * + * @param inputTokensDetails 输入令牌的详情 + * @param outputTokensDetails 输出令牌的详情 + * @param inputTokens 输入令牌的数量 + * @param outputTokens 输出令牌的数量 + * @param totalTokens 总令牌的数量 + * @param imageTokens 图像令牌的数量,如果适用 + */ +@JsonIgnoreProperties(ignoreUnknown = true) +data class Usage( + @JsonProperty("input_tokens_details") + val inputTokensDetails: TokenDetail?, + @JsonProperty("output_tokens_details") + val outputTokensDetails: TokenDetail?, + @JsonProperty("input_tokens") + val inputTokens: Int?, + @JsonProperty("output_tokens") + val outputTokens: Int?, + @JsonProperty("total_tokens") + val totalTokens: Int?, + @JsonProperty("image_tokens") + val imageTokens: Int? +) + +/** + * 令牌详情数据类 + * + * 该类提供了令牌的详细信息,目前仅支持文本令牌的数量 + * + * @param textTokens 文本令牌的数量 + */ +@JsonIgnoreProperties(ignoreUnknown = true) +data class TokenDetail( + @JsonProperty("text_tokens") + val textTokens: Int? +) diff --git a/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/service/BaiLianModelService.kt b/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/service/BaiLianModelService.kt index 3f6a488..d6c6a6b 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/service/BaiLianModelService.kt +++ b/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/service/BaiLianModelService.kt @@ -1,8 +1,8 @@ package org.jcnc.llmx.impl.baiLian.service import kotlinx.coroutines.flow.Flow -import org.jcnc.llmx.core.spi.entities.request.ChatRequest -import org.jcnc.llmx.core.spi.entities.response.ChatResponsePart +import org.jcnc.llmx.core.common.entities.request.ChatRequest +import org.jcnc.llmx.core.common.entities.response.ChatResponsePart /** @@ -20,4 +20,11 @@ interface BaiLianModelService { * @return 返回一个Flow流,包含部分聊天响应,允许逐步处理和消费响应 */ fun streamChat(request: ChatRequest): Flow + /** + * 使用流式多模态聊天交互 + * + * @param request 聊天请求对象,包含用户输入、上下文等信息 + * @return 返回一个Flow流,包含部分聊天响应,允许逐步处理和消费响应 + */ + fun streamMultimodalityChat(request: ChatRequest) : Flow } diff --git a/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/service/impl/BaiLianModelServiceImpl.kt b/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/service/impl/BaiLianModelServiceImpl.kt index 73c7d6b..f5340e6 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/service/impl/BaiLianModelServiceImpl.kt +++ b/llmx-impl/llmx-impl-bailian/src/main/kotlin/org/jcnc/llmx/impl/baiLian/service/impl/BaiLianModelServiceImpl.kt @@ -4,11 +4,13 @@ import com.fasterxml.jackson.core.type.TypeReference import com.fasterxml.jackson.databind.ObjectMapper import com.gewuyou.forgeboot.core.extension.log import kotlinx.coroutines.flow.Flow -import org.jcnc.llmx.core.spi.entities.request.ChatRequest -import org.jcnc.llmx.core.spi.entities.response.ChatResponsePart -import org.jcnc.llmx.core.spi.entities.response.Usage +import org.jcnc.llmx.core.common.entities.request.ChatRequest +import org.jcnc.llmx.core.common.entities.response.ChatResponsePart +import org.jcnc.llmx.core.common.entities.response.Usage + import org.jcnc.llmx.impl.baiLian.adapter.DashScopeAdapter import org.jcnc.llmx.impl.baiLian.config.entities.DashScopeProperties +import org.jcnc.llmx.impl.baiLian.entities.response.DashScopeResponse import org.jcnc.llmx.impl.baiLian.service.BaiLianModelService import org.springframework.stereotype.Service @@ -123,4 +125,75 @@ class BaiLianModelServiceImpl( } ) } + + /** + * 使用流式多模态聊天交互 + * + * @param request 聊天请求对象,包含用户输入、上下文等信息 + * @return 返回一个Flow流,包含部分聊天响应,允许逐步处理和消费响应 + */ + override fun streamMultimodalityChat(request: ChatRequest): Flow { + // 构造请求URL + val url = dashScopeProperties.multimodalityUrl + log.info("请求URL: $url") + // 构造请求头,包括授权信息和内容类型 + val headers = mapOf( + "Authorization" to "Bearer ${dashScopeProperties.apiKey}", + "Content-Type" to "application/json", + "X-DashScope-SSE" to "enable" + ) + log.info("请求头: $headers") + // 构造输入参数,主要包括用户的message + val inputMap = mutableMapOf("messages" to request.messages) + // 构造参数地图,包括是否包含思考、模型ID、增量输出等 + val parametersMap = mutableMapOf( + "incremental_output" to true, + ) + // 构造请求体,包括输入参数、构造的参数地图和调试信息 + val body = mapOf( + "model" to request.model, + "input" to inputMap, + "parameters" to parametersMap, + ) + // 发送流式聊天请求,并处理响应 + return dashScopeAdapter.sendStreamChat( + url, headers, body, + { json: String -> + val response = objectMapper.readValue(json, DashScopeResponse::class.java) + val choices = response + .output + ?.choices + ?.getOrNull(0) + // 提取输出文本 + val text = choices + ?.message + ?.content + ?.getOrNull(0) + ?.text + ?: "" + // 判断是否完成(finish_reason 通常为 "stop",但你这里是字符串 "null") + val finishReason = choices?.finishReason + val done = finishReason == "stop" + // 提取使用情况 + val usage = response.usage + val promptTokens = usage?.inputTokens ?: 0 + val completionTokens = usage?.outputTokens ?: 0 + val totalTokens = usage?.totalTokens ?: 0 + ChatResponsePart( + content = text, + done = done, + usage = Usage( + promptTokens = promptTokens, + completionTokens = completionTokens, + totalTokens = totalTokens + ), + other = mapOf( + "request_id" to (response.requestId ?: ""), + "model" to request.model, + "response" to json + ) + ) + } + ) + } } diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/application-dev.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/application-dev.yml index dd757e1..47077e1 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/application-dev.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/application-dev.yml @@ -22,3 +22,4 @@ aliyun: api-key: sk-78af4dd964a94f4cb373851064dbdc12 # API密钥 app-id: 3fae0bbab2e54a90a37aa02cd12dd62c # 应用ID base-url: https://dashscope.aliyuncs.com/api/v1/apps/ # 基础API URL + multimodality-url: https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml index c1d931f..27c53dc 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml @@ -18,3 +18,4 @@ aliyun: api-key: sk-78af4dd964a94f4cb373851064dbdc12 # API密钥 app-id: 3fae0bbab2e54a90a37aa02cd12dd62c # 应用ID base-url: https://dashscope.aliyuncs.com/api/v1/apps/ # 基础API URL + multimodality-url: https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation diff --git a/llmx-impl/llmx-impl-bailian/src/test/java/com/gewuyou/bailian/util/Base64Image.java b/llmx-impl/llmx-impl-bailian/src/test/java/com/gewuyou/bailian/util/Base64Image.java new file mode 100644 index 0000000..78420fe --- /dev/null +++ b/llmx-impl/llmx-impl-bailian/src/test/java/com/gewuyou/bailian/util/Base64Image.java @@ -0,0 +1,21 @@ +package com.gewuyou.bailian.util; + +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Base64; + +/** + * Base 64 图像 + * + * @author gewuyou + * @since 2025-05-08 18:56:02 + */ +public class Base64Image { + public static void main(String[] args) throws Exception { + byte[] imageBytes = Files.readAllBytes(Paths.get("F:/gewuyou/Project/Idea/demo-llm/src/main/resources/2025俏春装/10147009251.jpg")); + String base64Image = Base64.getEncoder().encodeToString(imageBytes); + String imagePayload = "data:image/jpeg;base64," + base64Image; + + System.out.println(imagePayload); // 你可以把它放到 JSON 中使用 + } +} diff --git a/llmx-impl/llmx-impl-bailian/src/test/java/com/gewuyou/bailian/util/DashScopeLocalImageClient.java b/llmx-impl/llmx-impl-bailian/src/test/java/com/gewuyou/bailian/util/DashScopeLocalImageClient.java new file mode 100644 index 0000000..6d3536f --- /dev/null +++ b/llmx-impl/llmx-impl-bailian/src/test/java/com/gewuyou/bailian/util/DashScopeLocalImageClient.java @@ -0,0 +1,85 @@ +package com.gewuyou.bailian.util; + + + +import java.io.BufferedReader; +import java.io.File; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.file.Files; +import java.util.Base64; +/** + * DashScopeLocalImageClient + * + * @author gewuyou + * @since 2025-05-08 18:57:58 + */ +public class DashScopeLocalImageClient { + + public static void main(String[] args) throws Exception { + // Step 1: 读取本地图片并转成 base64 + String imagePath = "F:/gewuyou/Project/Idea/demo-llm/src/main/resources/2025俏春装/10147009251.jpg"; + byte[] imageBytes = Files.readAllBytes(new File(imagePath).toPath()); + String base64Image = Base64.getEncoder().encodeToString(imageBytes); + String imageDataUrl = "data:image/jpeg;base64," + base64Image; + System.out.println(imageDataUrl); + // Step 2: 构造请求 JSON + String jsonBody = """ + { + "model": "qwen-vl-max-latest", + "input": { + "messages": [ + { + "role": "system", + "content": [ + { "text": "You are a helpful assistant." } + ] + }, + { + "role": "user", + "content": [ + { "image": "%s" }, + { "text": "请给这张图打标签" } + ] + } + ] + }, + "parameters": { + "incremental_output": true + } + } + """.formatted(imageDataUrl.replace("\n", "")); + + // Step 3: 发送 POST 请求 + URL url = new URL("https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation"); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + + connection.setRequestMethod("POST"); + connection.setRequestProperty("Authorization", "Bearer sk-78af4dd964a94f4cb373851064dbdc12"); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setDoOutput(true); + + try (OutputStream os = connection.getOutputStream()) { + os.write(jsonBody.getBytes()); + os.flush(); + } + + // Step 4: 读取响应 + int responseCode = connection.getResponseCode(); + System.out.println("Response Code: " + responseCode); + + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(responseCode == 200 ? + connection.getInputStream() : connection.getErrorStream(), "GBK"))) { + + String line; + while ((line = reader.readLine()) != null) { + System.out.println(line); + } + } + + connection.disconnect(); + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index e3f326d..04461a1 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -6,15 +6,25 @@ include( "llmx-core", ":llmx-core:llmx-core-service", ":llmx-core:llmx-core-spi", + ":llmx-core:llmx-core-api", + ":llmx-core:llmx-core-common", ) project(":llmx-core:llmx-core-service").name = "llmx-core-service" project(":llmx-core:llmx-core-spi").name = "llmx-core-spi" +project(":llmx-core:llmx-core-api").name = "llmx-core-api" +project(":llmx-core:llmx-core-common").name = "llmx-core-common" include( "llmx-impl", - "llmx-impl:llmx-impl-bailian", + ":llmx-impl:llmx-impl-bailian", // "llmx-impl:llmx-impl-openAi", ) project(":llmx-impl:llmx-impl-bailian").name = "llmx-impl-bailian" -//project(":llmx-impl:llmx-impl-openAi").name = "llmx-impl-openAi" \ No newline at end of file +//project(":llmx-impl:llmx-impl-openAi").name = "llmx-impl-openAi" + +include( + "llmx-app", + ":llmx-app:llmx-app-multimodality" +) +project(":llmx-app:llmx-app-multimodality").name = "llmx-app-multimodality" \ No newline at end of file -- 2.47.2 From bd38cf8536b70aca93f907164b3a54fe9b9a91e6 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Fri, 9 May 2025 08:07:57 +0800 Subject: [PATCH 11/44] =?UTF-8?q?ci(deploy):=20=E6=9B=B4=E6=96=B0=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=E5=B7=A5=E4=BD=9C=E6=B5=81=E5=B9=B6=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=B0=83=E8=AF=95=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改 COMPOSE_FILE 路径为 docker/docker-compose.test.yml - 在部署阶段的关键步骤添加当前路径和文件列表的打印,以便于调试- 在每个主要步骤前添加调试信息,提高日志可读性 --- .gitea/workflows/deploy.test.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.gitea/workflows/deploy.test.yml b/.gitea/workflows/deploy.test.yml index 5b922b8..e0ae175 100644 --- a/.gitea/workflows/deploy.test.yml +++ b/.gitea/workflows/deploy.test.yml @@ -9,7 +9,7 @@ env: # ========== 环境变量配置 ========== DOCKER_REGISTRY_URL: ${{vars.DOCKER_REGISTRY_URL}} # 私有Docker镜像仓库地址 PROJECT_NAME: llmx # 项目名称 - COMPOSE_FILE: docker-compose.test.yml # Docker compose文件路径 + COMPOSE_FILE: docker/docker-compose.test.yml # Docker compose文件路径 SERVER_PASSWORD: ${{ secrets.SERVER_PASSWORD }} # 仓库密码 JCNC_GITEA_URL: ${{vars.SERVER_GITEA_URL}} # Gitea地址 RUNNER_TOOL_CACHE: /opt/tools-cache # 工具缓存目录 @@ -104,7 +104,8 @@ jobs: # ========== 7. 部署阶段 ========== - name: 🔧 Prepare Deployment run: | - cd docker + echo "当前路径..." + pwd && ls -al echo "准备部署环境..." chmod +x ${COMPOSE_FILE} echo "当前Docker状态:" @@ -112,6 +113,8 @@ jobs: - name: 🧹 Clean Old Containers run: | + echo "当前路径..." + pwd && ls -al echo "清理旧容器..." docker compose -f ${COMPOSE_FILE} down --remove-orphans echo "清理后Docker状态:" @@ -119,6 +122,8 @@ jobs: - name: 🚀 Deploy New Version run: | + echo "当前路径..." + pwd && ls -al echo "拉取最新镜像..." docker compose -f ${COMPOSE_FILE} pull -- 2.47.2 From 0f6dc2449dbe47e2725dbd75a1e14751d1dd373b Mon Sep 17 00:00:00 2001 From: gewuyou Date: Fri, 9 May 2025 08:25:24 +0800 Subject: [PATCH 12/44] =?UTF-8?q?fix(docker):=20=E4=BF=AE=E6=AD=A3=20Docke?= =?UTF-8?q?r=20Compose=20=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 更新环境变量引用,使用正确的变量名 ${${DOCKER_REGISTRY_URL}} - 修正服务名称和卷名称中的大小写错误 - 统一使用小写字母以提高可读性和一致性 --- docker/docker-compose.test.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docker/docker-compose.test.yml b/docker/docker-compose.test.yml index 038a5fd..c128e81 100644 --- a/docker/docker-compose.test.yml +++ b/docker/docker-compose.test.yml @@ -14,7 +14,7 @@ services: volumes: - llmx-nacos-volume:/nacos/data llmx-core-service: - image: ${Docker_REGISTRY_URL}/llmx-core-service + image: ${${DOCKER_REGISTRY_URL}}/llmx-core-service container_name: llmx-core-service ports: - "9002:9002" @@ -25,9 +25,9 @@ services: volumes: - llmx-core-service-volume:/app/volume restart: always - llmx-impl-baiLian: - image: ${Docker_REGISTRY_URL}/llmx-impl-baiLian - container_name: llmx-impl-baiLian + llmx-impl-bailian: + image: ${${DOCKER_REGISTRY_URL}}/llmx-impl-bailian + container_name: llmx-impl-bailian ports: - "9003:9003" networks: @@ -35,7 +35,7 @@ services: environment: SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE} volumes: - - llmx-impl-baiLian-volume:/app/volume + - llmx-impl-bailian-volume:/app/volume restart: always llmx-core-database: image: postgres:16-alpine # 长期支持版本推荐用 16 @@ -57,6 +57,6 @@ networks: driver: bridge volumes: llmx-core-service-volume: - llmx-impl-baiLian-volume: + llmx-impl-bailian-volume: llmx-core-db-volume: llmx-nacos-volume: \ No newline at end of file -- 2.47.2 From f873d7bb10fd3e4b7bfdd9984ee85244ca553fac Mon Sep 17 00:00:00 2001 From: gewuyou Date: Fri, 9 May 2025 08:29:00 +0800 Subject: [PATCH 13/44] =?UTF-8?q?ci:=E4=BF=AE=E6=AD=A3=20Docker=20?= =?UTF-8?q?=E6=9E=84=E5=83=8F=E8=B7=AF=E5=BE=84=E5=8F=98=E9=87=8F=E5=BC=95?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 llmx-core-service 和 llmx-impl-bailian 服务中 -将 ${${DOCKER_REGISTRY_URL}}/llmx-core-service 和 ${${DOCKER_REGISTRY_URL}}/llmx-impl-bailian - 修改为 ${DOCKER_REGISTRY_URL}/llmx-core-service 和 ${DOCKER_REGISTRY_URL}/llmx-impl-bailian -以解决变量引用嵌套导致的路径错误问题 --- docker/docker-compose.test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/docker-compose.test.yml b/docker/docker-compose.test.yml index c128e81..8578230 100644 --- a/docker/docker-compose.test.yml +++ b/docker/docker-compose.test.yml @@ -14,7 +14,7 @@ services: volumes: - llmx-nacos-volume:/nacos/data llmx-core-service: - image: ${${DOCKER_REGISTRY_URL}}/llmx-core-service + image: ${DOCKER_REGISTRY_URL}/llmx-core-service container_name: llmx-core-service ports: - "9002:9002" @@ -26,7 +26,7 @@ services: - llmx-core-service-volume:/app/volume restart: always llmx-impl-bailian: - image: ${${DOCKER_REGISTRY_URL}}/llmx-impl-bailian + image: ${DOCKER_REGISTRY_URL}/llmx-impl-bailian container_name: llmx-impl-bailian ports: - "9003:9003" -- 2.47.2 From a2575049490e170e570ecd859836a30c59cacde9 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Fri, 9 May 2025 08:55:45 +0800 Subject: [PATCH 14/44] =?UTF-8?q?test(infrastructure):=20=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E6=B5=8B=E8=AF=95=E7=8E=AF=E5=A2=83=E7=AB=AF=E5=8F=A3?= =?UTF-8?q?=E6=98=A0=E5=B0=84=E5=B9=B6=E5=85=B3=E9=97=AD=20Nacos=20?= =?UTF-8?q?=E9=89=B4=E6=9D=83-=20=E4=BF=AE=E6=94=B9=20llmx-impl-bailian=20?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E7=9A=84=E6=B5=8B=E8=AF=95=E7=AB=AF=E5=8F=A3?= =?UTF-8?q?=E4=B8=BA=209003=20-=20=E6=9B=B4=E6=96=B0=20Docker=20Compose=20?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E9=85=8D=E7=BD=AE=EF=BC=8C=E8=B0=83=E6=95=B4?= =?UTF-8?q?=20Nacos=20=E5=92=8C=E6=95=B0=E6=8D=AE=E5=BA=93=E7=AB=AF?= =?UTF-8?q?=E5=8F=A3=E6=98=A0=E5=B0=84=20-=20=E5=9C=A8=20Nacos=20=E5=AE=B9?= =?UTF-8?q?=E5=99=A8=E4=B8=AD=E6=B7=BB=E5=8A=A0=E7=8E=AF=E5=A2=83=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E7=A6=81=E7=94=A8=E9=89=B4=E6=9D=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker/docker-compose.test.yml | 9 +++++---- .../src/main/resources/application-test.yml | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/docker/docker-compose.test.yml b/docker/docker-compose.test.yml index 8578230..8f3f9de 100644 --- a/docker/docker-compose.test.yml +++ b/docker/docker-compose.test.yml @@ -4,13 +4,14 @@ services: container_name: llmx-nacos restart: always ports: - - "8848:9001" - - "9848:9053" - - "9849:9054" + - "9001:8848" + - "9053:9848" + - "9054:9849" networks: - llmx-net-test environment: MODE: standalone # 显式指定为单体模式 + NACOS_AUTH_ENABLE: "false" # 👈 关闭鉴权 volumes: - llmx-nacos-volume:/nacos/data llmx-core-service: @@ -42,7 +43,7 @@ services: container_name: llmx-core-database restart: always ports: - - "5432:9052" + - "9052:5432" networks: - llmx-net-test environment: diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml index 27c53dc..5e8cc5b 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml @@ -1,5 +1,5 @@ server: - port: 8082 + port: 9003 spring: config: import: classpath:bootstrap-test.yml -- 2.47.2 From 0265d7cfe05599d00c2113bb42e7b748f8692609 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Fri, 9 May 2025 10:04:55 +0800 Subject: [PATCH 15/44] =?UTF-8?q?ci:=20=E6=9B=B4=E6=96=B0=20Nacos=20?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 Nacos 服务地址从具体的 IP 地址修改为 llmx-nacos:8848 - 此修改适用于 llmx-core 和 llmx-impl 两个模块的配置文件 --- .../llmx-core-service/src/main/resources/bootstrap-test.yml | 2 +- .../llmx-impl-bailian/src/main/resources/bootstrap-test.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml b/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml index c9dc5c7..bd1a2f0 100644 --- a/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml +++ b/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml @@ -3,7 +3,7 @@ spring: nacos: username: nacos password: L4s6f9y3 - server-addr: 49.235.96.75:9001 + server-addr: llmx-nacos:8848 discovery: server-addr: ${spring.cloud.nacos.server-addr} username: ${spring.cloud.nacos.username} diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml index c9dc5c7..bd1a2f0 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml @@ -3,7 +3,7 @@ spring: nacos: username: nacos password: L4s6f9y3 - server-addr: 49.235.96.75:9001 + server-addr: llmx-nacos:8848 discovery: server-addr: ${spring.cloud.nacos.server-addr} username: ${spring.cloud.nacos.username} -- 2.47.2 From 224c6125256ab8b81319351c538a845646300382 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Fri, 9 May 2025 10:18:15 +0800 Subject: [PATCH 16/44] =?UTF-8?q?refactor(llmx-core,=20llmx-impl):=20?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=20Nacos=20=E9=85=8D=E7=BD=AE=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E5=86=97=E4=BD=99=E5=8F=82=E6=95=B0-=20=E4=BB=8E=20ll?= =?UTF-8?q?mx-core=20=E5=92=8C=20llmx-impl=20=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=20bootstrap-test.yml=20=E6=96=87=E4=BB=B6=E4=B8=AD=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E4=BA=86=20Nacos=20=E9=85=8D=E7=BD=AE=E7=9A=84=20user?= =?UTF-8?q?name=20=E5=92=8C=20password=20=E5=8F=82=E6=95=B0=20-=20?= =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BA=86=20Nacos=20discovery=20=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=EF=BC=8C=E4=BB=85=E4=BF=9D=E7=95=99=20server-addr=20?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../llmx-core-service/src/main/resources/bootstrap-test.yml | 6 +----- .../llmx-impl-bailian/src/main/resources/bootstrap-test.yml | 6 +----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml b/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml index bd1a2f0..d22c560 100644 --- a/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml +++ b/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml @@ -1,10 +1,6 @@ spring: cloud: nacos: - username: nacos - password: L4s6f9y3 server-addr: llmx-nacos:8848 discovery: - server-addr: ${spring.cloud.nacos.server-addr} - username: ${spring.cloud.nacos.username} - password: ${spring.cloud.nacos.password} \ No newline at end of file + server-addr: ${spring.cloud.nacos.server-addr} \ No newline at end of file diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml index bd1a2f0..d22c560 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml @@ -1,10 +1,6 @@ spring: cloud: nacos: - username: nacos - password: L4s6f9y3 server-addr: llmx-nacos:8848 discovery: - server-addr: ${spring.cloud.nacos.server-addr} - username: ${spring.cloud.nacos.username} - password: ${spring.cloud.nacos.password} \ No newline at end of file + server-addr: ${spring.cloud.nacos.server-addr} \ No newline at end of file -- 2.47.2 From c2d40091c23c48423e3f3f27231249d6053c4f97 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Fri, 9 May 2025 10:30:02 +0800 Subject: [PATCH 17/44] =?UTF-8?q?refactor(llmx-core):=20=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E6=9C=8D=E5=8A=A1=E6=98=A0=E5=B0=84=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将所有 qwen 模型的服务映射统一为 llmx-impl-bailian - 修正了服务映射名称的拼写错误(将 BaiLian 改为 bailian) --- .../src/main/resources/application-test.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/llmx-core/llmx-core-service/src/main/resources/application-test.yml b/llmx-core/llmx-core-service/src/main/resources/application-test.yml index e9166e1..0b5b82a 100644 --- a/llmx-core/llmx-core-service/src/main/resources/application-test.yml +++ b/llmx-core/llmx-core-service/src/main/resources/application-test.yml @@ -6,9 +6,9 @@ spring: llmx: model-route: modelServiceMap: - qwen-turbo: llmx-impl-baiLian - qwen-max: llmx-impl-baiLian - qwen-plus: llmx-impl-baiLian - qwen-vl-max-latest: llmx-impl-baiLian + qwen-turbo: llmx-impl-bailian + qwen-max: llmx-impl-bailian + qwen-plus: llmx-impl-bailian + qwen-vl-max-latest: llmx-impl-bailian -- 2.47.2 From 89c19bbcfeceb925520d614dcbe21b74c277fa1c Mon Sep 17 00:00:00 2001 From: gewuyou Date: Fri, 9 May 2025 10:45:08 +0800 Subject: [PATCH 18/44] =?UTF-8?q?build:=20=E6=9B=B4=E6=96=B0=20Docker=20?= =?UTF-8?q?=E9=95=9C=E5=83=8F=E6=9E=84=E5=BB=BA=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 为 llmx-core-service 和 llmx-impl-bailian 项目添加自定义 entrypoint - 安装 netcat-openbsd 并使用 /entrypoint.sh 启动应用 -指定 Nacos 服务器地址和端口 - 优化镜像构建过程,提高启动速度和可靠性 --- build.gradle.kts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index a22d08a..9aef9e6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -119,14 +119,26 @@ subprojects { ports = listOf("9002") environment = mapOf("SPRING_PROFILES_ACTIVE" to env) imageName = "llmx-core-service" -// paths = listOf(File(rootProject.projectDir, "scripts").absolutePath) + paths = listOf(File(rootProject.projectDir, "scripts").absolutePath) + entrypoint = listOf( + "/bin/sh", "-c", + "apt-get update && apt-get install -y netcat-openbsd && " + + "/entrypoint.sh -d llmx-nacos:8848 -c " + + "'java -cp $( cat /app/jib-classpath-file ) $( cat /app/jib-main-class-file )'" + ) } project { projectName = "llmx-impl-bailian" ports = listOf("9003") environment = mapOf("SPRING_PROFILES_ACTIVE" to env) imageName = "llmx-impl-bailian" -// paths = listOf(File(rootProject.projectDir, "scripts").absolutePath) + paths = listOf(File(rootProject.projectDir, "scripts").absolutePath) + entrypoint = listOf( + "/bin/sh", "-c", + "apt-get update && apt-get install -y netcat-openbsd && " + + "/entrypoint.sh -d llmx-nacos:8848 -c " + + "'java -cp $( cat /app/jib-classpath-file ) $( cat /app/jib-main-class-file )'" + ) } } } -- 2.47.2 From 3bdbf42adf65bf485f9f9e96e24594b9eb32a5ae Mon Sep 17 00:00:00 2001 From: gewuyou Date: Fri, 9 May 2025 11:10:46 +0800 Subject: [PATCH 19/44] =?UTF-8?q?build:=20=E4=BF=AE=E6=94=B9=E5=85=A5?= =?UTF-8?q?=E5=8F=A3=E7=82=B9=E6=9D=83=E9=99=90=E8=AE=BE=E7=BD=AE-=20?= =?UTF-8?q?=E5=B0=86=20"/scripts/entrypoint.sh"=20=E7=9A=84=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E4=BF=AE=E6=94=B9=E4=B8=BA=20"/entrypoint.sh"=20-=20?= =?UTF-8?q?=E4=BF=9D=E6=8C=81=E6=9D=83=E9=99=90=E8=AE=BE=E7=BD=AE=E4=B8=BA?= =?UTF-8?q?=20"755"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/kotlin/org/jcnc/llmx/plugin/jib/entity/JibProject.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/org/jcnc/llmx/plugin/jib/entity/JibProject.kt b/buildSrc/src/main/kotlin/org/jcnc/llmx/plugin/jib/entity/JibProject.kt index 0e95a2e..35496c4 100644 --- a/buildSrc/src/main/kotlin/org/jcnc/llmx/plugin/jib/entity/JibProject.kt +++ b/buildSrc/src/main/kotlin/org/jcnc/llmx/plugin/jib/entity/JibProject.kt @@ -22,7 +22,7 @@ data class JibProject( var paths: List = listOf(), var imageName: String = "", var version: String = "latest", - var permissions: Map = mapOf("/scripts/entrypoint.sh" to "755"), + var permissions: Map = mapOf("/entrypoint.sh" to "755"), var baseImage: String = "docker://bellsoft/liberica-openjdk-debian:21" ) { init { -- 2.47.2 From 8ee99bb398a3b6b8784507ee6878f815956aa402 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Fri, 9 May 2025 11:32:39 +0800 Subject: [PATCH 20/44] =?UTF-8?q?build(jib):=20=E6=9B=B4=E6=96=B0=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E9=95=9C=E5=83=8F=E5=B9=B6=E8=B0=83=E6=95=B4=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 build.gradle.kts 中的 netcat-openbsd 安装指令- 更新 JibProject 中的 baseImage 为 gewuyou/liberica-openjdk-debian-nc- 重新启用并修正 llmx-impl-openai 模块的名称 --- build.gradle.kts | 2 -- .../main/kotlin/org/jcnc/llmx/plugin/jib/entity/JibProject.kt | 2 +- settings.gradle.kts | 4 ++-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 9aef9e6..c6e85f0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -122,7 +122,6 @@ subprojects { paths = listOf(File(rootProject.projectDir, "scripts").absolutePath) entrypoint = listOf( "/bin/sh", "-c", - "apt-get update && apt-get install -y netcat-openbsd && " + "/entrypoint.sh -d llmx-nacos:8848 -c " + "'java -cp $( cat /app/jib-classpath-file ) $( cat /app/jib-main-class-file )'" ) @@ -135,7 +134,6 @@ subprojects { paths = listOf(File(rootProject.projectDir, "scripts").absolutePath) entrypoint = listOf( "/bin/sh", "-c", - "apt-get update && apt-get install -y netcat-openbsd && " + "/entrypoint.sh -d llmx-nacos:8848 -c " + "'java -cp $( cat /app/jib-classpath-file ) $( cat /app/jib-main-class-file )'" ) diff --git a/buildSrc/src/main/kotlin/org/jcnc/llmx/plugin/jib/entity/JibProject.kt b/buildSrc/src/main/kotlin/org/jcnc/llmx/plugin/jib/entity/JibProject.kt index 35496c4..09e7ae2 100644 --- a/buildSrc/src/main/kotlin/org/jcnc/llmx/plugin/jib/entity/JibProject.kt +++ b/buildSrc/src/main/kotlin/org/jcnc/llmx/plugin/jib/entity/JibProject.kt @@ -23,7 +23,7 @@ data class JibProject( var imageName: String = "", var version: String = "latest", var permissions: Map = mapOf("/entrypoint.sh" to "755"), - var baseImage: String = "docker://bellsoft/liberica-openjdk-debian:21" + var baseImage: String = "docker://gewuyou/liberica-openjdk-debian-nc" ) { init { if (imageName.isBlank()) { diff --git a/settings.gradle.kts b/settings.gradle.kts index 04461a1..68e41c4 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -18,10 +18,10 @@ project(":llmx-core:llmx-core-common").name = "llmx-core-common" include( "llmx-impl", ":llmx-impl:llmx-impl-bailian", -// "llmx-impl:llmx-impl-openAi", + "llmx-impl:llmx-impl-openai", ) project(":llmx-impl:llmx-impl-bailian").name = "llmx-impl-bailian" -//project(":llmx-impl:llmx-impl-openAi").name = "llmx-impl-openAi" +project(":llmx-impl:llmx-impl-openai").name = "llmx-impl-openai" include( "llmx-app", -- 2.47.2 From 8a19372b43f3244bc3368c1298614e11df770a5d Mon Sep 17 00:00:00 2001 From: gewuyou Date: Fri, 9 May 2025 11:39:39 +0800 Subject: [PATCH 21/44] =?UTF-8?q?build(jib):=20=E6=9B=B4=E6=96=B0=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E9=95=9C=E5=83=8F=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 baseImage属性从 "docker://gewuyou/liberica-openjdk-debian-nc" 修改为 "docker://gewuyou/liberica-openjdk-debian-nc:21" - 此更新统一了基础镜像版本,确保构建的一致性和稳定性 --- .../main/kotlin/org/jcnc/llmx/plugin/jib/entity/JibProject.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/org/jcnc/llmx/plugin/jib/entity/JibProject.kt b/buildSrc/src/main/kotlin/org/jcnc/llmx/plugin/jib/entity/JibProject.kt index 09e7ae2..33480b9 100644 --- a/buildSrc/src/main/kotlin/org/jcnc/llmx/plugin/jib/entity/JibProject.kt +++ b/buildSrc/src/main/kotlin/org/jcnc/llmx/plugin/jib/entity/JibProject.kt @@ -23,7 +23,7 @@ data class JibProject( var imageName: String = "", var version: String = "latest", var permissions: Map = mapOf("/entrypoint.sh" to "755"), - var baseImage: String = "docker://gewuyou/liberica-openjdk-debian-nc" + var baseImage: String = "docker://gewuyou/liberica-openjdk-debian-nc:21" ) { init { if (imageName.isBlank()) { -- 2.47.2 From 72051230436832349e8e7475f8827084fd527816 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Fri, 9 May 2025 11:52:34 +0800 Subject: [PATCH 22/44] =?UTF-8?q?ci(deploy):=20=E6=B7=BB=E5=8A=A0=E6=B8=85?= =?UTF-8?q?=E7=90=86=E6=97=A0=E6=A0=87=E7=AD=BE=E9=95=9C=E5=83=8F=E6=AD=A5?= =?UTF-8?q?=E9=AA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在部署流程结束后增加清理无标签镜像的步骤 - 使用 docker image prune -f 命令快速清理无标签镜像 --- .gitea/workflows/deploy.test.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitea/workflows/deploy.test.yml b/.gitea/workflows/deploy.test.yml index e0ae175..fcd3933 100644 --- a/.gitea/workflows/deploy.test.yml +++ b/.gitea/workflows/deploy.test.yml @@ -131,4 +131,8 @@ jobs: docker compose -f ${COMPOSE_FILE} up -d echo "=== 服务状态检查 ===" - docker compose -f ${COMPOSE_FILE} ps \ No newline at end of file + docker compose -f ${COMPOSE_FILE} ps + - name: 🧼 Cleanup Dangling Images + run: | + echo "开始清理无标签镜像..." + docker image prune -f \ No newline at end of file -- 2.47.2 From 67a6c32c6ce27a163eb54384e7254b5051c182e0 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Fri, 9 May 2025 12:02:16 +0800 Subject: [PATCH 23/44] =?UTF-8?q?feat(llmx-impl):=20=E6=B7=BB=E5=8A=A0=20O?= =?UTF-8?q?penAI=20=E5=AE=9E=E7=8E=B0=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 llmx-impl-openai 模块 - 添加基本的项目结构和配置 - 创建 Spring Boot应用程序入口和测试类- 设置 Git 属性和忽略文件 --- llmx-impl/llmx-impl-bailian/build.gradle.kts | 5 ++- llmx-impl/llmx-impl-openai/.gitattributes | 3 ++ llmx-impl/llmx-impl-openai/.gitignore | 40 +++++++++++++++++++ llmx-impl/llmx-impl-openai/build.gradle.kts | 19 +++++++++ .../impl/openai/LlmxImplOpenaiApplication.kt | 11 +++++ .../src/main/resources/application.properties | 1 + .../openai/LlmxImplOpenaiApplicationTests.kt | 13 ++++++ 7 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 llmx-impl/llmx-impl-openai/.gitattributes create mode 100644 llmx-impl/llmx-impl-openai/.gitignore create mode 100644 llmx-impl/llmx-impl-openai/build.gradle.kts create mode 100644 llmx-impl/llmx-impl-openai/src/main/kotlin/org/jcnc/llmx/impl/openai/LlmxImplOpenaiApplication.kt create mode 100644 llmx-impl/llmx-impl-openai/src/main/resources/application.properties create mode 100644 llmx-impl/llmx-impl-openai/src/test/kotlin/org/jcnc/llmx/impl/openai/LlmxImplOpenaiApplicationTests.kt diff --git a/llmx-impl/llmx-impl-bailian/build.gradle.kts b/llmx-impl/llmx-impl-bailian/build.gradle.kts index c27bbf7..81b169f 100644 --- a/llmx-impl/llmx-impl-bailian/build.gradle.kts +++ b/llmx-impl/llmx-impl-bailian/build.gradle.kts @@ -10,8 +10,6 @@ dependencies { implementation(libs.kotlinx.coruntes.reactor) - implementation(libs.aliyun.bailian) - implementation(libs.okHttp) implementation(libs.forgeBoot.core.extension) @@ -19,5 +17,8 @@ dependencies { implementation(libs.jackson.module.kotlin) implementation(libs.forgeBoot.core.extension) + + implementation(libs.aliyun.bailian) + } diff --git a/llmx-impl/llmx-impl-openai/.gitattributes b/llmx-impl/llmx-impl-openai/.gitattributes new file mode 100644 index 0000000..8af972c --- /dev/null +++ b/llmx-impl/llmx-impl-openai/.gitattributes @@ -0,0 +1,3 @@ +/gradlew text eol=lf +*.bat text eol=crlf +*.jar binary diff --git a/llmx-impl/llmx-impl-openai/.gitignore b/llmx-impl/llmx-impl-openai/.gitignore new file mode 100644 index 0000000..5a979af --- /dev/null +++ b/llmx-impl/llmx-impl-openai/.gitignore @@ -0,0 +1,40 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Kotlin ### +.kotlin diff --git a/llmx-impl/llmx-impl-openai/build.gradle.kts b/llmx-impl/llmx-impl-openai/build.gradle.kts new file mode 100644 index 0000000..66e3405 --- /dev/null +++ b/llmx-impl/llmx-impl-openai/build.gradle.kts @@ -0,0 +1,19 @@ +// 开启springboot +setProperty(ProjectFlags.USE_SPRING_BOOT_WEB, true) +setProperty(ProjectFlags.USE_SPRING_CLOUD_BOM,true) +dependencies { + // Nacos 服务发现和配置 + implementation(libs.springCloudStarter.alibaba.nacos.discovery) + + implementation(project(Modules.Core.SPI)) + + implementation(libs.kotlinx.coruntes.reactor) + + implementation(libs.okHttp) + + implementation(libs.forgeBoot.core.extension) + + implementation(libs.jackson.module.kotlin) + + implementation(libs.forgeBoot.core.extension) +} diff --git a/llmx-impl/llmx-impl-openai/src/main/kotlin/org/jcnc/llmx/impl/openai/LlmxImplOpenaiApplication.kt b/llmx-impl/llmx-impl-openai/src/main/kotlin/org/jcnc/llmx/impl/openai/LlmxImplOpenaiApplication.kt new file mode 100644 index 0000000..2379a0d --- /dev/null +++ b/llmx-impl/llmx-impl-openai/src/main/kotlin/org/jcnc/llmx/impl/openai/LlmxImplOpenaiApplication.kt @@ -0,0 +1,11 @@ +package org.jcnc.llmx.impl.openai + +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.runApplication + +@SpringBootApplication +class LlmxImplOpenaiApplication + +fun main(args: Array) { + runApplication(*args) +} diff --git a/llmx-impl/llmx-impl-openai/src/main/resources/application.properties b/llmx-impl/llmx-impl-openai/src/main/resources/application.properties new file mode 100644 index 0000000..ab85386 --- /dev/null +++ b/llmx-impl/llmx-impl-openai/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=llmx-impl-openai diff --git a/llmx-impl/llmx-impl-openai/src/test/kotlin/org/jcnc/llmx/impl/openai/LlmxImplOpenaiApplicationTests.kt b/llmx-impl/llmx-impl-openai/src/test/kotlin/org/jcnc/llmx/impl/openai/LlmxImplOpenaiApplicationTests.kt new file mode 100644 index 0000000..80e1231 --- /dev/null +++ b/llmx-impl/llmx-impl-openai/src/test/kotlin/org/jcnc/llmx/impl/openai/LlmxImplOpenaiApplicationTests.kt @@ -0,0 +1,13 @@ +package org.jcnc.llmx.impl.openai + +import org.junit.jupiter.api.Test +import org.springframework.boot.test.context.SpringBootTest + +@SpringBootTest +class LlmxImplOpenaiApplicationTests { + + @Test + fun contextLoads() { + } + +} -- 2.47.2 From e6149ecb026288a53b4e44590efeff04be78a266 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Fri, 9 May 2025 14:16:56 +0800 Subject: [PATCH 24/44] =?UTF-8?q?feat(llmx-core-service):=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0CORS=E9=85=8D=E7=BD=AE=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增CorsConfig类,实现全局CORS配置 - 允许所有来源、所有HTTP方法和所有请求头- 禁用Cookie携带,预检请求缓存时间为3600秒 --- .../llmx/core/service/config/CorsConfig.kt | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/CorsConfig.kt diff --git a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/CorsConfig.kt b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/CorsConfig.kt new file mode 100644 index 0000000..e23a21a --- /dev/null +++ b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/CorsConfig.kt @@ -0,0 +1,23 @@ +package org.jcnc.llmx.core.service.config + +import org.springframework.context.annotation.Configuration +import org.springframework.web.servlet.config.annotation.CorsRegistry +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer + +/** + *CORS配置 + * + * @since 2025-04-02 17:03:41 + * @author gewuyou + */ +@Configuration +open class CorsConfig : WebMvcConfigurer { + override fun addCorsMappings(registry: CorsRegistry) { + registry.addMapping("/**") // 匹配所有路径 + .allowedOrigins("*") // 允许所有来源(生产环境建议指定具体域名) + .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允许的HTTP方法 + .allowedHeaders("*") // 允许所有请求头 + .allowCredentials(false) // 是否允许携带Cookie(true时需要明确指定allowedOrigins,不能为*) + .maxAge(3600) // 预检请求缓存时间(秒) + } +} \ No newline at end of file -- 2.47.2 From 7400c4d24f8ab09885342fe1abd0ee41cb33a481 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Fri, 9 May 2025 15:12:31 +0800 Subject: [PATCH 25/44] =?UTF-8?q?refactor(llmx-core):=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E8=B7=A8=E5=9F=9F=E9=85=8D=E7=BD=AE=E5=B9=B6=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除全局 CorsConfig 类,注释保留备用- 在 ChatController 中添加跨域配置 - 将 AppConfiguration 类和 webClientBuilder 方法改为开放 --- .../core/service/config/AppConfiguration.kt | 4 +- .../llmx/core/service/config/CorsConfig.kt | 59 +++++++++++-------- .../core/service/controller/ChatController.kt | 2 + 3 files changed, 40 insertions(+), 25 deletions(-) diff --git a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/AppConfiguration.kt b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/AppConfiguration.kt index fda061a..6d400c3 100644 --- a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/AppConfiguration.kt +++ b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/AppConfiguration.kt @@ -14,7 +14,7 @@ import org.springframework.web.reactive.function.client.WebClient */ @Configuration @EnableConfigurationProperties(ModelProperties::class) -class AppConfiguration { +open class AppConfiguration { /** * 创建一个配置了负载均衡的WebClient构建器 * @@ -25,7 +25,7 @@ class AppConfiguration { */ @Bean @LoadBalanced - fun webClientBuilder(): WebClient.Builder { + open fun webClientBuilder(): WebClient.Builder { return WebClient.builder() } } \ No newline at end of file diff --git a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/CorsConfig.kt b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/CorsConfig.kt index e23a21a..e955bf5 100644 --- a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/CorsConfig.kt +++ b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/CorsConfig.kt @@ -1,23 +1,36 @@ -package org.jcnc.llmx.core.service.config - -import org.springframework.context.annotation.Configuration -import org.springframework.web.servlet.config.annotation.CorsRegistry -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer - -/** - *CORS配置 - * - * @since 2025-04-02 17:03:41 - * @author gewuyou - */ -@Configuration -open class CorsConfig : WebMvcConfigurer { - override fun addCorsMappings(registry: CorsRegistry) { - registry.addMapping("/**") // 匹配所有路径 - .allowedOrigins("*") // 允许所有来源(生产环境建议指定具体域名) - .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允许的HTTP方法 - .allowedHeaders("*") // 允许所有请求头 - .allowCredentials(false) // 是否允许携带Cookie(true时需要明确指定allowedOrigins,不能为*) - .maxAge(3600) // 预检请求缓存时间(秒) - } -} \ No newline at end of file +//package org.jcnc.llmx.core.service.config +// +//import com.gewuyou.forgeboot.core.extension.log +//import org.springframework.context.annotation.Configuration +//import org.springframework.web.servlet.config.annotation.CorsRegistry +//import org.springframework.web.servlet.config.annotation.WebMvcConfigurer +// +///** +// * CORS配置类 +// * +// * 该类用于全局配置跨域请求设置,以确保前端应用可以与后端服务进行通信 +// * 主要通过重写addCorsMappings方法来配置跨域请求映射,以及通过corsWebFilter方法来提供更细粒度的跨域支持 +// * +// * @since 2025-04-02 17:03:41 +// * @author gewuyou +// */ +//@Configuration +//open class CorsConfig : WebMvcConfigurer { +// /** +// * 添加跨域请求映射 +// * +// * 该方法重写了父接口中的addCorsMappings方法,用于配置全局的跨域请求规则 +// * 主要配置了允许所有路径、所有来源、常见HTTP方法、所有请求头的跨域请求,并设置了不携带Cookie以及预检请求缓存时间 +// * +// * @param registry 跨域请求注册表,用于添加跨域请求映射 +// */ +// override fun addCorsMappings(registry: CorsRegistry) { +// log.info("Web CORS配置生效") +// registry.addMapping("/**") // 匹配所有路径 +// .allowedOrigins("*") // 允许所有来源(生产环境建议指定具体域名) +// .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允许的HTTP方法 +// .allowedHeaders("*") // 允许所有请求头 +// .allowCredentials(false) // 是否允许携带Cookie(true时需要明确指定allowedOrigins,不能为*) +// .maxAge(3600) // 预检请求缓存时间(秒) +// } +//} diff --git a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/controller/ChatController.kt b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/controller/ChatController.kt index e905147..dd8d64b 100644 --- a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/controller/ChatController.kt +++ b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/controller/ChatController.kt @@ -8,6 +8,7 @@ import org.jcnc.llmx.core.service.service.impl.LLMServiceImpl import org.reactivestreams.Publisher import org.springframework.http.MediaType +import org.springframework.web.bind.annotation.CrossOrigin import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody @@ -23,6 +24,7 @@ import org.springframework.web.bind.annotation.RestController @ApiVersion @RestController @RequestMapping("/chat") +@CrossOrigin(origins = ["*"]) // 放宽跨域 class ChatController( private val llmServiceImpl: LLMServiceImpl ) { -- 2.47.2 From 690ede78f09bb8b041fe4143ff9d5a8714bcde19 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Fri, 9 May 2025 18:15:10 +0800 Subject: [PATCH 26/44] =?UTF-8?q?refactor(gradle):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E6=9E=84=E5=BB=BA=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 更新依赖版本: - forgeBoot 版本从 1.1.0-SNAPSHOT 升级到 1.2.0-SNAPSHOT - spring-dependency-management 版本 1.1.7 未变 - aliyun-bailian 版本 2.0.0 未变 - spring-cloud-starter-alibaba-nacos-discovery 版本 2023.0.1.0 未变 - okHttp 版本 4.12.0 未变 - jib 版本 3.4.2 未变 - org-reactivestreams-reactiveStreams 版本 1.0.4 未变- 调整模块间依赖: - llmx-core-service: 依赖从 Core.SPI 改为 Core.COMMON - llmx-impl-bailian 和 llmx-impl-openai: 移除冗余依赖,统一配置 - 根项目:添加 USE_LLM_IMPL_PLATFORM_DEPENDENCE 标志 - 移除跨域配置类 CorsConfig 中的注释 - 修改 LlmxCoreServiceApplication 类为 open - 删除 ChatController 中的 @CrossOrigin 注解 --- build.gradle.kts | 63 ++++++++++------ buildSrc/src/main/kotlin/ProjectFlags.kt | 7 +- gradle/libs.versions.toml | 2 +- llmx-core/llmx-core-service/build.gradle.kts | 2 +- .../service/LlmxCoreServiceApplication.kt | 2 +- .../llmx/core/service/config/CorsConfig.kt | 72 +++++++++---------- .../core/service/controller/ChatController.kt | 4 -- llmx-impl/llmx-impl-bailian/build.gradle.kts | 22 +----- llmx-impl/llmx-impl-openai/build.gradle.kts | 18 +---- 9 files changed, 91 insertions(+), 101 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index c6e85f0..1e755df 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,6 @@ plugins { alias(libs.plugins.kotlin.jvm) alias(libs.plugins.kotlin.plugin.spring) alias(libs.plugins.spring.boot) - alias(libs.plugins.spring.dependency.management) alias(libs.plugins.jibLocalPlugin) } @@ -20,10 +19,11 @@ allprojects { // 设置全局属性 ext { set(ProjectFlags.USE_SPRING_BOOT_WEB, false) - set(ProjectFlags.USE_LLM_CORE_SPI, false) + set(ProjectFlags.USE_LLM_KT_IMPL_DEPENDENCE, false) set(ProjectFlags.USE_SPRING_CLOUD_BOM, false) set(ProjectFlags.IS_ROOT_MODULE, false) - set(ProjectFlags.USE_SPRING_BOOT_BOM,false) + set(ProjectFlags.USE_SPRING_BOOT_BOM, false) + set(ProjectFlags.USE_LLM_IMPL_PLATFORM_DEPENDENCE, false) } repositories { mavenLocal() @@ -34,9 +34,6 @@ allprojects { maven { url = uri("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev") } -// maven { -// url = uri("https://raw.githubusercontent.com/eurotech/kura_addons/mvn-repo/") -// } maven { url = uri("https://maven.aliyun.com/repository/public/") } @@ -68,24 +65,25 @@ allprojects { subprojects { afterEvaluate { - // springbootWeb - if (project.getPropertyByBoolean(ProjectFlags.USE_SPRING_BOOT_WEB)) { + if (project.getPropertyByBoolean(ProjectFlags.USE_LLM_IMPL_PLATFORM_DEPENDENCE)) { apply { - plugin(libs.plugins.spring.dependency.management.get().pluginId) - plugin(libs.plugins.spring.boot.get().pluginId) plugin(libs.plugins.kotlin.plugin.spring.get().pluginId) } - dependencies { - implementation(libs.springBootStarter.web) - - testImplementation(libs.springBootStarter.test) - testRuntimeOnly(libs.junitPlatform.launcher) + ext { + setProperty(ProjectFlags.USE_SPRING_BOOT_WEB, true) + setProperty(ProjectFlags.USE_SPRING_CLOUD_BOM, true) + setProperty(ProjectFlags.USE_LLM_KT_IMPL_DEPENDENCE, true) } - } - // llmx-core-spi - if (project.getPropertyByBoolean(ProjectFlags.USE_LLM_CORE_SPI)) { dependencies { + // Nacos 服务发现和配置 + implementation(libs.springCloudStarter.alibaba.nacos.discovery) + // 核心spi依赖 implementation(project(Modules.Core.SPI)) + // okHttp依赖 + implementation(libs.okHttp) + // forgeBoot依赖 + implementation(libs.forgeBoot.core.extension) + implementation(libs.forgeBoot.core.extension) } } // springCloudBom @@ -94,11 +92,34 @@ subprojects { implementation(platform(libs.springCloudDependencies.bom)) } } - if(project.getPropertyByBoolean(ProjectFlags.USE_SPRING_BOOT_BOM)){ + // springBootBom + if (project.getPropertyByBoolean(ProjectFlags.USE_SPRING_BOOT_BOM)) { dependencies { implementation(platform(libs.springBootDependencies.bom)) } } + // springbootWeb + if (project.getPropertyByBoolean(ProjectFlags.USE_SPRING_BOOT_WEB)) { + apply { + plugin(libs.plugins.spring.boot.get().pluginId) + } + dependencies { + implementation(libs.springBootStarter.web) + implementation(platform(libs.springBootDependencies.bom)) + testImplementation(libs.springBootStarter.test) + testRuntimeOnly(libs.junitPlatform.launcher) + } + } + // 使用kt实现impl服务依赖 + if (project.getPropertyByBoolean(ProjectFlags.USE_LLM_KT_IMPL_DEPENDENCE)) { + dependencies { + // jackson kt模块依赖 + implementation(libs.jackson.module.kotlin) + // kt协程依赖 + implementation(libs.kotlinx.coruntes.reactor) + } + } + } val libs = rootProject.libs apply { @@ -122,7 +143,7 @@ subprojects { paths = listOf(File(rootProject.projectDir, "scripts").absolutePath) entrypoint = listOf( "/bin/sh", "-c", - "/entrypoint.sh -d llmx-nacos:8848 -c " + + "/entrypoint.sh -d llmx-nacos:8848 -c " + "'java -cp $( cat /app/jib-classpath-file ) $( cat /app/jib-main-class-file )'" ) } @@ -134,7 +155,7 @@ subprojects { paths = listOf(File(rootProject.projectDir, "scripts").absolutePath) entrypoint = listOf( "/bin/sh", "-c", - "/entrypoint.sh -d llmx-nacos:8848 -c " + + "/entrypoint.sh -d llmx-nacos:8848 -c " + "'java -cp $( cat /app/jib-classpath-file ) $( cat /app/jib-main-class-file )'" ) } diff --git a/buildSrc/src/main/kotlin/ProjectFlags.kt b/buildSrc/src/main/kotlin/ProjectFlags.kt index c00120c..a64e694 100644 --- a/buildSrc/src/main/kotlin/ProjectFlags.kt +++ b/buildSrc/src/main/kotlin/ProjectFlags.kt @@ -2,6 +2,11 @@ object ProjectFlags { const val USE_SPRING_BOOT_WEB = "useSpringBootWeb" const val USE_SPRING_BOOT_BOM = "useSpringBootBom" const val USE_SPRING_CLOUD_BOM = "useSpringCloudBom" - const val USE_LLM_CORE_SPI = "useLLMCoreSPI" + const val USE_LLM_KT_IMPL_DEPENDENCE = "useLLMKtImplDependence" const val IS_ROOT_MODULE = "isRootModule" + + /** + * 使用实现服务第三方平台依赖 + */ + const val USE_LLM_IMPL_PLATFORM_DEPENDENCE = "useLLMImplPlatformDependence" } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d6c2bde..60b4995 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ spring-boot-version = "3.2.4" spring-dependency-management-version = "1.1.7" aliyun-bailian-version = "2.0.0" spring-cloud-starter-alibaba-nacos-discovery-version = "2023.0.1.0" -forgeBoot-version = "1.1.0-SNAPSHOT" +forgeBoot-version = "1.2.0-SNAPSHOT" okHttp-version = "4.12.0" jib-version = "3.4.2" org-reactivestreams-reactiveStreams-version = "1.0.4" diff --git a/llmx-core/llmx-core-service/build.gradle.kts b/llmx-core/llmx-core-service/build.gradle.kts index 1dd6a57..a1e96b5 100644 --- a/llmx-core/llmx-core-service/build.gradle.kts +++ b/llmx-core/llmx-core-service/build.gradle.kts @@ -13,7 +13,7 @@ dependencies { implementation(libs.springCloudStarter.loadbalancer) - implementation(project(Modules.Core.SPI)) + implementation(project(Modules.Core.COMMON)) // Kotlin Coroutines implementation(libs.kotlinx.coruntes.reactor) diff --git a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/LlmxCoreServiceApplication.kt b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/LlmxCoreServiceApplication.kt index c9b9fec..0a06e34 100644 --- a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/LlmxCoreServiceApplication.kt +++ b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/LlmxCoreServiceApplication.kt @@ -6,7 +6,7 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient @SpringBootApplication @EnableDiscoveryClient -class LlmxCoreServiceApplication +open class LlmxCoreServiceApplication /** * 程序的入口点。 diff --git a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/CorsConfig.kt b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/CorsConfig.kt index e955bf5..cfda34b 100644 --- a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/CorsConfig.kt +++ b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/CorsConfig.kt @@ -1,36 +1,36 @@ -//package org.jcnc.llmx.core.service.config -// -//import com.gewuyou.forgeboot.core.extension.log -//import org.springframework.context.annotation.Configuration -//import org.springframework.web.servlet.config.annotation.CorsRegistry -//import org.springframework.web.servlet.config.annotation.WebMvcConfigurer -// -///** -// * CORS配置类 -// * -// * 该类用于全局配置跨域请求设置,以确保前端应用可以与后端服务进行通信 -// * 主要通过重写addCorsMappings方法来配置跨域请求映射,以及通过corsWebFilter方法来提供更细粒度的跨域支持 -// * -// * @since 2025-04-02 17:03:41 -// * @author gewuyou -// */ -//@Configuration -//open class CorsConfig : WebMvcConfigurer { -// /** -// * 添加跨域请求映射 -// * -// * 该方法重写了父接口中的addCorsMappings方法,用于配置全局的跨域请求规则 -// * 主要配置了允许所有路径、所有来源、常见HTTP方法、所有请求头的跨域请求,并设置了不携带Cookie以及预检请求缓存时间 -// * -// * @param registry 跨域请求注册表,用于添加跨域请求映射 -// */ -// override fun addCorsMappings(registry: CorsRegistry) { -// log.info("Web CORS配置生效") -// registry.addMapping("/**") // 匹配所有路径 -// .allowedOrigins("*") // 允许所有来源(生产环境建议指定具体域名) -// .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允许的HTTP方法 -// .allowedHeaders("*") // 允许所有请求头 -// .allowCredentials(false) // 是否允许携带Cookie(true时需要明确指定allowedOrigins,不能为*) -// .maxAge(3600) // 预检请求缓存时间(秒) -// } -//} +package org.jcnc.llmx.core.service.config + +import com.gewuyou.forgeboot.core.extension.log +import org.springframework.context.annotation.Configuration +import org.springframework.web.servlet.config.annotation.CorsRegistry +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer + +/** + * CORS配置类 + * + * 该类用于全局配置跨域请求设置,以确保前端应用可以与后端服务进行通信 + * 主要通过重写addCorsMappings方法来配置跨域请求映射,以及通过corsWebFilter方法来提供更细粒度的跨域支持 + * + * @since 2025-04-02 17:03:41 + * @author gewuyou + */ +@Configuration +open class CorsConfig : WebMvcConfigurer { + /** + * 添加跨域请求映射 + * + * 该方法重写了父接口中的addCorsMappings方法,用于配置全局的跨域请求规则 + * 主要配置了允许所有路径、所有来源、常见HTTP方法、所有请求头的跨域请求,并设置了不携带Cookie以及预检请求缓存时间 + * + * @param registry 跨域请求注册表,用于添加跨域请求映射 + */ + override fun addCorsMappings(registry: CorsRegistry) { + log.info("Web CORS配置生效") + registry.addMapping("/**") // 匹配所有路径 + .allowedOrigins("*") // 允许所有来源(生产环境建议指定具体域名) + .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允许的HTTP方法 + .allowedHeaders("*") // 允许所有请求头 + .allowCredentials(false) // 是否允许携带Cookie(true时需要明确指定allowedOrigins,不能为*) + .maxAge(3600) // 预检请求缓存时间(秒) + } +} diff --git a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/controller/ChatController.kt b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/controller/ChatController.kt index dd8d64b..a851e34 100644 --- a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/controller/ChatController.kt +++ b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/controller/ChatController.kt @@ -5,11 +5,8 @@ import com.gewuyou.forgeboot.webmvc.version.annotation.ApiVersion import org.jcnc.llmx.core.common.entities.request.ChatRequest import org.jcnc.llmx.core.common.entities.response.ChatResponsePart import org.jcnc.llmx.core.service.service.impl.LLMServiceImpl - import org.reactivestreams.Publisher import org.springframework.http.MediaType -import org.springframework.web.bind.annotation.CrossOrigin - import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping @@ -24,7 +21,6 @@ import org.springframework.web.bind.annotation.RestController @ApiVersion @RestController @RequestMapping("/chat") -@CrossOrigin(origins = ["*"]) // 放宽跨域 class ChatController( private val llmServiceImpl: LLMServiceImpl ) { diff --git a/llmx-impl/llmx-impl-bailian/build.gradle.kts b/llmx-impl/llmx-impl-bailian/build.gradle.kts index 81b169f..cd168b9 100644 --- a/llmx-impl/llmx-impl-bailian/build.gradle.kts +++ b/llmx-impl/llmx-impl-bailian/build.gradle.kts @@ -1,24 +1,6 @@ - -// 开启springboot -setProperty(ProjectFlags.USE_SPRING_BOOT_WEB, true) -setProperty(ProjectFlags.USE_SPRING_CLOUD_BOM,true) +// 开启LLM实现平台依赖 +setProperty(ProjectFlags.USE_LLM_IMPL_PLATFORM_DEPENDENCE, true) dependencies { - // Nacos 服务发现和配置 - implementation(libs.springCloudStarter.alibaba.nacos.discovery) - - implementation(project(Modules.Core.SPI)) - - implementation(libs.kotlinx.coruntes.reactor) - - implementation(libs.okHttp) - - implementation(libs.forgeBoot.core.extension) - - implementation(libs.jackson.module.kotlin) - - implementation(libs.forgeBoot.core.extension) - implementation(libs.aliyun.bailian) - } diff --git a/llmx-impl/llmx-impl-openai/build.gradle.kts b/llmx-impl/llmx-impl-openai/build.gradle.kts index 66e3405..1ccb355 100644 --- a/llmx-impl/llmx-impl-openai/build.gradle.kts +++ b/llmx-impl/llmx-impl-openai/build.gradle.kts @@ -1,19 +1,5 @@ -// 开启springboot -setProperty(ProjectFlags.USE_SPRING_BOOT_WEB, true) -setProperty(ProjectFlags.USE_SPRING_CLOUD_BOM,true) +// 开启LLM实现平台依赖 +setProperty(ProjectFlags.USE_LLM_IMPL_PLATFORM_DEPENDENCE, true) dependencies { - // Nacos 服务发现和配置 - implementation(libs.springCloudStarter.alibaba.nacos.discovery) - implementation(project(Modules.Core.SPI)) - - implementation(libs.kotlinx.coruntes.reactor) - - implementation(libs.okHttp) - - implementation(libs.forgeBoot.core.extension) - - implementation(libs.jackson.module.kotlin) - - implementation(libs.forgeBoot.core.extension) } -- 2.47.2 From a192b98787a8b952882bd514ebe3bc4509936f5c Mon Sep 17 00:00:00 2001 From: gewuyou Date: Fri, 9 May 2025 19:24:08 +0800 Subject: [PATCH 27/44] =?UTF-8?q?chore(llmx-core):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E6=9C=8D=E5=8A=A1=E6=98=A0=E5=B0=84=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 resolveServiceName 函数中添加 modelServiceMap 的日志输出- 优化代码结构,提高可读性 --- .../org/jcnc/llmx/core/service/manager/ModelRouteManager.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/manager/ModelRouteManager.kt b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/manager/ModelRouteManager.kt index 72ef815..88324e1 100644 --- a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/manager/ModelRouteManager.kt +++ b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/manager/ModelRouteManager.kt @@ -1,6 +1,7 @@ package org.jcnc.llmx.core.service.manager +import com.gewuyou.forgeboot.core.extension.log import org.jcnc.llmx.core.service.config.ModelProperties import org.springframework.stereotype.Component @@ -28,7 +29,9 @@ class ModelRouteManager( * @throws IllegalArgumentException 如果模型名不匹配任何已知前缀,抛出此异常 */ fun resolveServiceName(model: String): String { - for ((prefix, serviceName) in modelProperties.modelServiceMap) { + val modelServiceMap = modelProperties.modelServiceMap + log.info("modelServiceMap: $modelServiceMap") + for ((prefix, serviceName) in modelServiceMap) { if (model.startsWith(prefix)) { return serviceName } -- 2.47.2 From a6e9c9150929bcf1f9806dc88f14e9a0f9358a75 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Fri, 9 May 2025 21:22:47 +0800 Subject: [PATCH 28/44] =?UTF-8?q?build:=20=E6=9B=B4=E6=96=B0=20forgeBoot?= =?UTF-8?q?=20=E7=89=88=E6=9C=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 forgeBoot版本从 "1.2.0-SNAPSHOT" 修改为 "1.2.0" -此更新统一了 maven 和 git 的版本号,确保版本一致性 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 60b4995..cc9bf50 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ spring-boot-version = "3.2.4" spring-dependency-management-version = "1.1.7" aliyun-bailian-version = "2.0.0" spring-cloud-starter-alibaba-nacos-discovery-version = "2023.0.1.0" -forgeBoot-version = "1.2.0-SNAPSHOT" +forgeBoot-version = "1.2.0" okHttp-version = "4.12.0" jib-version = "3.4.2" org-reactivestreams-reactiveStreams-version = "1.0.4" -- 2.47.2 From f4d8aee52d996f2a9c9a83d9a0fcdbddb182ceb4 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Fri, 9 May 2025 22:03:00 +0800 Subject: [PATCH 29/44] =?UTF-8?q?build:=20=E6=9B=B4=E6=96=B0=20forgeBoot?= =?UTF-8?q?=20=E7=89=88=E6=9C=AC=E8=87=B3=201.3.0-SNAPSHOT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cc9bf50..3c45ef2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ spring-boot-version = "3.2.4" spring-dependency-management-version = "1.1.7" aliyun-bailian-version = "2.0.0" spring-cloud-starter-alibaba-nacos-discovery-version = "2023.0.1.0" -forgeBoot-version = "1.2.0" +forgeBoot-version = "1.3.0-SNAPSHOT" okHttp-version = "4.12.0" jib-version = "3.4.2" org-reactivestreams-reactiveStreams-version = "1.0.4" -- 2.47.2 From 44bba93112b4cd062f96bde98c938872f6a274de Mon Sep 17 00:00:00 2001 From: gewuyou Date: Sat, 10 May 2025 11:37:20 +0800 Subject: [PATCH 30/44] =?UTF-8?q?refactor(llmx):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E5=B9=B6=E5=A2=9E=E5=BC=BA?= =?UTF-8?q?=20Nacos=20=E9=85=8D=E7=BD=AE=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 application.yml 中的阿里云配置 -重命名 application-prod.yml 为 application-master.yml - 更新 application-test.yml 文件,移除阿里云配置 - 删除 bootstrap-test.yml 文件- 新增 nacos-test.yml 文件,用于 Nacos 配置- 更新 build.gradle.kts 文件,添加 Nacos 配置支持- 更新 docker-compose.test.yml,开启 Nacos 鉴权 --- build.gradle.kts | 1 + docker/docker-compose.test.yml | 3 ++- gradle/libs.versions.toml | 1 + llmx-core/llmx-core-service/build.gradle.kts | 1 + .../src/main/resources/application-test.yml | 9 +-------- .../src/main/resources/bootstrap-test.yml | 6 ------ .../src/main/resources/nacos-test.yml | 14 ++++++++++++++ ...lication-prod.yml => application-master.yml} | 2 +- .../src/main/resources/application-test.yml | 17 ++--------------- .../src/main/resources/application.yml | 17 +---------------- .../src/main/resources/bootstrap-test.yml | 6 ------ .../src/main/resources/nacos-test.yml | 14 ++++++++++++++ 12 files changed, 38 insertions(+), 53 deletions(-) delete mode 100644 llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml create mode 100644 llmx-core/llmx-core-service/src/main/resources/nacos-test.yml rename llmx-impl/llmx-impl-bailian/src/main/resources/{application-prod.yml => application-master.yml} (96%) delete mode 100644 llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml create mode 100644 llmx-impl/llmx-impl-bailian/src/main/resources/nacos-test.yml diff --git a/build.gradle.kts b/build.gradle.kts index 1e755df..f685e60 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -77,6 +77,7 @@ subprojects { dependencies { // Nacos 服务发现和配置 implementation(libs.springCloudStarter.alibaba.nacos.discovery) + implementation(libs.springCloudStarter.alibaba.nacos.config) // 核心spi依赖 implementation(project(Modules.Core.SPI)) // okHttp依赖 diff --git a/docker/docker-compose.test.yml b/docker/docker-compose.test.yml index 8f3f9de..7500bbb 100644 --- a/docker/docker-compose.test.yml +++ b/docker/docker-compose.test.yml @@ -11,7 +11,8 @@ services: - llmx-net-test environment: MODE: standalone # 显式指定为单体模式 - NACOS_AUTH_ENABLE: "false" # 👈 关闭鉴权 + NACOS_AUTH_ENABLE: "true" # ✅ 开启鉴权 + NACOS_AUTH_CACHE_ENABLE: "false" volumes: - llmx-nacos-volume:/nacos/data llmx-core-service: diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3c45ef2..d3f400a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -42,6 +42,7 @@ aliyun-bailian = { group = "com.aliyun", name = "bailian20231229", version.ref = # SrpingCloud springCloudStarter-alibaba-nacos-discovery = { group = "com.alibaba.cloud", name = "spring-cloud-starter-alibaba-nacos-discovery", version.ref = "spring-cloud-starter-alibaba-nacos-discovery-version" } +springCloudStarter-alibaba-nacos-config = { group = "com.alibaba.cloud", name = "spring-cloud-starter-alibaba-nacos-config", version.ref = "spring-cloud-starter-alibaba-nacos-discovery-version" } springCloudStarter-loadbalancer = { group = "org.springframework.cloud", name = "spring-cloud-starter-loadbalancer" } springCloudStarter-openfeign = { group = "org.springframework.cloud", name = "spring-cloud-starter-openfeign" } diff --git a/llmx-core/llmx-core-service/build.gradle.kts b/llmx-core/llmx-core-service/build.gradle.kts index a1e96b5..c8c72af 100644 --- a/llmx-core/llmx-core-service/build.gradle.kts +++ b/llmx-core/llmx-core-service/build.gradle.kts @@ -7,6 +7,7 @@ dependencies { val libs = rootProject.libs // Nacos 服务发现和配置 implementation(libs.springCloudStarter.alibaba.nacos.discovery) + implementation(libs.springCloudStarter.alibaba.nacos.config) // WebClient 和 Spring Cloud LoadBalancer implementation(libs.springBootStarter.webflux) diff --git a/llmx-core/llmx-core-service/src/main/resources/application-test.yml b/llmx-core/llmx-core-service/src/main/resources/application-test.yml index 0b5b82a..53ea532 100644 --- a/llmx-core/llmx-core-service/src/main/resources/application-test.yml +++ b/llmx-core/llmx-core-service/src/main/resources/application-test.yml @@ -2,13 +2,6 @@ server: port: 9002 spring: config: - import: classpath:bootstrap-test.yml -llmx: - model-route: - modelServiceMap: - qwen-turbo: llmx-impl-bailian - qwen-max: llmx-impl-bailian - qwen-plus: llmx-impl-bailian - qwen-vl-max-latest: llmx-impl-bailian + import: classpath:nacos-test.yml diff --git a/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml b/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml deleted file mode 100644 index d22c560..0000000 --- a/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml +++ /dev/null @@ -1,6 +0,0 @@ -spring: - cloud: - nacos: - server-addr: llmx-nacos:8848 - discovery: - server-addr: ${spring.cloud.nacos.server-addr} \ No newline at end of file diff --git a/llmx-core/llmx-core-service/src/main/resources/nacos-test.yml b/llmx-core/llmx-core-service/src/main/resources/nacos-test.yml new file mode 100644 index 0000000..548e46f --- /dev/null +++ b/llmx-core/llmx-core-service/src/main/resources/nacos-test.yml @@ -0,0 +1,14 @@ +spring: + cloud: + nacos: + server-addr: llmx-nacos:8848 + discovery: + server-addr: ${spring.cloud.nacos.server-addr} + config: + server-addr: ${spring.cloud.nacos.server-addr} + file-extension: yaml + namespace: 8720bd0b-1a64-418e-a922-7b92cd16d54b + shared-configs: + - data-id: llmx-core-service.yml + refresh: true + group: test \ No newline at end of file diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/application-prod.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/application-master.yml similarity index 96% rename from llmx-impl/llmx-impl-bailian/src/main/resources/application-prod.yml rename to llmx-impl/llmx-impl-bailian/src/main/resources/application-master.yml index 276545e..292217d 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/application-prod.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/application-master.yml @@ -2,7 +2,7 @@ server: port: 9003 spring: application: - name: llmx-impl-baiLian + name: llmx-impl-bailian cloud: nacos: discovery: diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml index 5e8cc5b..44b2dde 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml @@ -2,20 +2,7 @@ server: port: 9003 spring: config: - import: classpath:bootstrap-test.yml + import: classpath:nacos-test.yml application: name: llmx-impl-bailian -# 阿里云配置 -aliyun: - # DashScope服务配置 - dash: - # 访问凭证配置 - scope: - access-key-id: LTAI5tHiA2Ry3XTAfoSEJW6z # 阿里云访问密钥ID - access-key-secret: K5sf4FxZZuUgLEFnyfepBfMqFGmDcD # 阿里云访问密钥密钥 - endpoint: bailian.cn-beijing.aliyuncs.com # 阿里云服务端点 - workspace-id: llm-axfkuqft05uzbjpi # 工作区ID - api-key: sk-78af4dd964a94f4cb373851064dbdc12 # API密钥 - app-id: 3fae0bbab2e54a90a37aa02cd12dd62c # 应用ID - base-url: https://dashscope.aliyuncs.com/api/v1/apps/ # 基础API URL - multimodality-url: https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation + diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/application.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/application.yml index e7bb9d6..caf4dfc 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/application.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/application.yml @@ -1,18 +1,3 @@ spring: - application: - name: llmx-impl-baiLian profiles: - active: dev -# 阿里云配置 -aliyun: - # DashScope服务配置 - dash: - # 访问凭证配置 - scope: - access-key-id: LTAI5tHiA2Ry3XTAfoSEJW6z # 阿里云访问密钥ID - access-key-secret: K5sf4FxZZuUgLEFnyfepBfMqFGmDcD # 阿里云访问密钥密钥 - endpoint: bailian.cn-beijing.aliyuncs.com # 阿里云服务端点 - workspace-id: llm-axfkuqft05uzbjpi # 工作区ID - api-key: sk-78af4dd964a94f4cb373851064dbdc12 # API密钥 - app-id: 3fae0bbab2e54a90a37aa02cd12dd62c # 应用ID - base-url: https://dashscope.aliyuncs.com/api/v1/apps/ # 基础API URL \ No newline at end of file + active: dev \ No newline at end of file diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml deleted file mode 100644 index d22c560..0000000 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml +++ /dev/null @@ -1,6 +0,0 @@ -spring: - cloud: - nacos: - server-addr: llmx-nacos:8848 - discovery: - server-addr: ${spring.cloud.nacos.server-addr} \ No newline at end of file diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/nacos-test.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/nacos-test.yml new file mode 100644 index 0000000..1eee04e --- /dev/null +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/nacos-test.yml @@ -0,0 +1,14 @@ +spring: + cloud: + nacos: + server-addr: llmx-nacos:8848 + discovery: + server-addr: ${spring.cloud.nacos.server-addr} + config: + server-addr: ${spring.cloud.nacos.server-addr} + file-extension: yaml + namespace: 2067164e-f3c1-4545-86eb-db13912af42e + shared-configs: + - data-id: llmx-impl-bailian.yml + refresh: true + group: test \ No newline at end of file -- 2.47.2 From 7258dd2ead4a1a68d4afbd964171e1b5625e537e Mon Sep 17 00:00:00 2001 From: gewuyou Date: Sat, 10 May 2025 11:50:18 +0800 Subject: [PATCH 31/44] =?UTF-8?q?feat(security):=20=E4=B8=BA=20Nacos=20?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=B7=BB=E5=8A=A0=E7=94=A8=E6=88=B7=E5=90=8D?= =?UTF-8?q?=E5=92=8C=E5=AF=86=E7=A0=81=E8=AE=A4=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 docker-compose.test.yml 中添加 Nacos 认证所需的环境变量 - 更新 nacos-test.yml 文件,增加用户名和密码配置- 修复了没有配置认证信息导致的连接失败问题 --- docker/docker-compose.test.yml | 3 +++ .../llmx-core-service/src/main/resources/nacos-test.yml | 6 ++++++ .../llmx-impl-bailian/src/main/resources/nacos-test.yml | 6 ++++++ 3 files changed, 15 insertions(+) diff --git a/docker/docker-compose.test.yml b/docker/docker-compose.test.yml index 7500bbb..597c16b 100644 --- a/docker/docker-compose.test.yml +++ b/docker/docker-compose.test.yml @@ -13,6 +13,9 @@ services: MODE: standalone # 显式指定为单体模式 NACOS_AUTH_ENABLE: "true" # ✅ 开启鉴权 NACOS_AUTH_CACHE_ENABLE: "false" + NACOS_AUTH_IDENTITY_KEY: "nacos" # 可选,默认是 nacos + NACOS_AUTH_IDENTITY_VALUE: "L4s6f9y3," # 可选 + NACOS_AUTH_TOKEN_SECRET_KEY: "h61bUSqvp0npCNHIZ0VzqBFz2U59UKrECE6TvBt58DQ=" # ✅ JWT 密钥 volumes: - llmx-nacos-volume:/nacos/data llmx-core-service: diff --git a/llmx-core/llmx-core-service/src/main/resources/nacos-test.yml b/llmx-core/llmx-core-service/src/main/resources/nacos-test.yml index 548e46f..54f0b40 100644 --- a/llmx-core/llmx-core-service/src/main/resources/nacos-test.yml +++ b/llmx-core/llmx-core-service/src/main/resources/nacos-test.yml @@ -2,10 +2,16 @@ spring: cloud: nacos: server-addr: llmx-nacos:8848 + username: nacos + password: L4s6f9y3, discovery: server-addr: ${spring.cloud.nacos.server-addr} + username: ${spring.cloud.nacos.username} + password: ${spring.cloud.nacos.password} config: server-addr: ${spring.cloud.nacos.server-addr} + username: ${spring.cloud.nacos.username} + password: ${spring.cloud.nacos.password} file-extension: yaml namespace: 8720bd0b-1a64-418e-a922-7b92cd16d54b shared-configs: diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/nacos-test.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/nacos-test.yml index 1eee04e..71179eb 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/nacos-test.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/nacos-test.yml @@ -2,10 +2,16 @@ spring: cloud: nacos: server-addr: llmx-nacos:8848 + username: nacos + password: L4s6f9y3, discovery: server-addr: ${spring.cloud.nacos.server-addr} + username: ${spring.cloud.nacos.username} + password: ${spring.cloud.nacos.password} config: server-addr: ${spring.cloud.nacos.server-addr} + username: ${spring.cloud.nacos.username} + password: ${spring.cloud.nacos.password} file-extension: yaml namespace: 2067164e-f3c1-4545-86eb-db13912af42e shared-configs: -- 2.47.2 From 472e1a8a5ad33cafc362f6b917299daaea843409 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Sat, 10 May 2025 12:07:50 +0800 Subject: [PATCH 32/44] =?UTF-8?q?fix(docker):=20=E4=BF=AE=E6=AD=A3=20Docke?= =?UTF-8?q?r=20Compose=20=E9=85=8D=E7=BD=AE=E4=B8=AD=E7=9A=84=20JWT=20?= =?UTF-8?q?=E5=AF=86=E9=92=A5=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 NACOS_AUTH_TOKEN_SECRET_KEY 更名为 NACOS_AUTH_TOKEN - 此修改解决了环境变量配置错误导致的问题 --- docker/docker-compose.test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/docker-compose.test.yml b/docker/docker-compose.test.yml index 597c16b..2fe8d95 100644 --- a/docker/docker-compose.test.yml +++ b/docker/docker-compose.test.yml @@ -15,7 +15,7 @@ services: NACOS_AUTH_CACHE_ENABLE: "false" NACOS_AUTH_IDENTITY_KEY: "nacos" # 可选,默认是 nacos NACOS_AUTH_IDENTITY_VALUE: "L4s6f9y3," # 可选 - NACOS_AUTH_TOKEN_SECRET_KEY: "h61bUSqvp0npCNHIZ0VzqBFz2U59UKrECE6TvBt58DQ=" # ✅ JWT 密钥 + NACOS_AUTH_TOKEN: "h61bUSqvp0npCNHIZ0VzqBFz2U59UKrECE6TvBt58DQ=" # ✅ JWT 密钥 volumes: - llmx-nacos-volume:/nacos/data llmx-core-service: -- 2.47.2 From db63fd6a27c5ffd1c5a0e01b61c46c61296b37b4 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Sat, 10 May 2025 12:17:55 +0800 Subject: [PATCH 33/44] =?UTF-8?q?ci:=20=E6=9B=B4=E6=96=B0=20Nacos=20?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E4=B8=AD=E7=9A=84=E5=91=BD?= =?UTF-8?q?=E5=90=8D=E7=A9=BA=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改 llmx-core-service 的 Nacos命名空间为 1a32d4f4-469a-4e10-ba3b-ce1bc6ba8cc9 - 修改 llmx-impl-bailian 的 Nacos 命名空间为 da45f3a6-e7d0-4d92-b075-776adea07d6d --- llmx-core/llmx-core-service/src/main/resources/nacos-test.yml | 2 +- llmx-impl/llmx-impl-bailian/src/main/resources/nacos-test.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/llmx-core/llmx-core-service/src/main/resources/nacos-test.yml b/llmx-core/llmx-core-service/src/main/resources/nacos-test.yml index 54f0b40..143c1eb 100644 --- a/llmx-core/llmx-core-service/src/main/resources/nacos-test.yml +++ b/llmx-core/llmx-core-service/src/main/resources/nacos-test.yml @@ -13,7 +13,7 @@ spring: username: ${spring.cloud.nacos.username} password: ${spring.cloud.nacos.password} file-extension: yaml - namespace: 8720bd0b-1a64-418e-a922-7b92cd16d54b + namespace: 1a32d4f4-469a-4e10-ba3b-ce1bc6ba8cc9 shared-configs: - data-id: llmx-core-service.yml refresh: true diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/nacos-test.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/nacos-test.yml index 71179eb..7b2d7f2 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/nacos-test.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/nacos-test.yml @@ -13,7 +13,7 @@ spring: username: ${spring.cloud.nacos.username} password: ${spring.cloud.nacos.password} file-extension: yaml - namespace: 2067164e-f3c1-4545-86eb-db13912af42e + namespace: da45f3a6-e7d0-4d92-b075-776adea07d6d shared-configs: - data-id: llmx-impl-bailian.yml refresh: true -- 2.47.2 From dae4a5858976898c648df40018906baaaceda4dc Mon Sep 17 00:00:00 2001 From: gewuyou Date: Sat, 10 May 2025 12:44:19 +0800 Subject: [PATCH 34/44] =?UTF-8?q?ci:=20=E6=9B=B4=E6=96=B0=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=8E=AF=E5=A2=83=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 llmx-core-service 和 llmx-impl-bailian 模块的 application-test.yml 文件中添加 Nacos 配置导入 - 新增的配置包括命名空间和分组信息,用于区分不同的环境和应用 --- .../llmx-core-service/src/main/resources/application-test.yml | 4 +++- .../llmx-impl-bailian/src/main/resources/application-test.yml | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/llmx-core/llmx-core-service/src/main/resources/application-test.yml b/llmx-core/llmx-core-service/src/main/resources/application-test.yml index 53ea532..3e862cb 100644 --- a/llmx-core/llmx-core-service/src/main/resources/application-test.yml +++ b/llmx-core/llmx-core-service/src/main/resources/application-test.yml @@ -2,6 +2,8 @@ server: port: 9002 spring: config: - import: classpath:nacos-test.yml + import: + - classpath:nacos-test.yml + - nacos:llmx-core-service.yml?namespace=1a32d4f4-469a-4e10-ba3b-ce1bc6ba8cc9&group=test diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml index 44b2dde..c475634 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml @@ -2,7 +2,9 @@ server: port: 9003 spring: config: - import: classpath:nacos-test.yml + import: + - classpath:nacos-test.yml + - nacos:llmx-impl-bailian.yml?namespace=da45f3a6-e7d0-4d92-b075-776adea07d6d&group=test application: name: llmx-impl-bailian -- 2.47.2 From 35bbec3b2944bd8e3169f86ddee6e722cf76099e Mon Sep 17 00:00:00 2001 From: gewuyou Date: Sat, 10 May 2025 12:55:48 +0800 Subject: [PATCH 35/44] =?UTF-8?q?env(docker):=20=E6=9B=B4=E6=96=B0=20Nacos?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=B9=B6=E8=B0=83=E6=95=B4=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=8D=B7=E6=8C=82=E8=BD=BD=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在环境变量中添加 NACOS_SERVER_IP 设置为0.0.0.0- 修改 Nacos 数据卷挂载路径,从 /nacos/data改为 /home/nacos --- docker/docker-compose.test.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker/docker-compose.test.yml b/docker/docker-compose.test.yml index 2fe8d95..d9f6471 100644 --- a/docker/docker-compose.test.yml +++ b/docker/docker-compose.test.yml @@ -10,6 +10,7 @@ services: networks: - llmx-net-test environment: + NACOS_SERVER_IP: "0.0.0.0" MODE: standalone # 显式指定为单体模式 NACOS_AUTH_ENABLE: "true" # ✅ 开启鉴权 NACOS_AUTH_CACHE_ENABLE: "false" @@ -17,7 +18,7 @@ services: NACOS_AUTH_IDENTITY_VALUE: "L4s6f9y3," # 可选 NACOS_AUTH_TOKEN: "h61bUSqvp0npCNHIZ0VzqBFz2U59UKrECE6TvBt58DQ=" # ✅ JWT 密钥 volumes: - - llmx-nacos-volume:/nacos/data + - llmx-nacos-volume:/home/nacos llmx-core-service: image: ${DOCKER_REGISTRY_URL}/llmx-core-service container_name: llmx-core-service -- 2.47.2 From 6225e769e2ccee4862cbb5b9e3854001c68e8164 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Sat, 10 May 2025 13:10:07 +0800 Subject: [PATCH 36/44] =?UTF-8?q?test(docker):=20=E7=A7=BB=E9=99=A4=20NACO?= =?UTF-8?q?S=5FSERVER=5FIP=20=E7=8E=AF=E5=A2=83=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 从 docker-compose.test.yml 文件中移除了 NACOS_SERVER_IP 环境变量设置 - 保留了其他环境变量设置,包括模式、鉴权和缓存配置 --- docker/docker-compose.test.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/docker/docker-compose.test.yml b/docker/docker-compose.test.yml index d9f6471..521a8b5 100644 --- a/docker/docker-compose.test.yml +++ b/docker/docker-compose.test.yml @@ -10,7 +10,6 @@ services: networks: - llmx-net-test environment: - NACOS_SERVER_IP: "0.0.0.0" MODE: standalone # 显式指定为单体模式 NACOS_AUTH_ENABLE: "true" # ✅ 开启鉴权 NACOS_AUTH_CACHE_ENABLE: "false" -- 2.47.2 From 549e4f3b9750f02d8d37ffa5c2ec35b9a4cd770f Mon Sep 17 00:00:00 2001 From: gewuyou Date: Sat, 10 May 2025 13:41:55 +0800 Subject: [PATCH 37/44] =?UTF-8?q?build(deps):=20=E6=B7=BB=E5=8A=A0=20sprin?= =?UTF-8?q?g-cloud-starter-bootstrap=20=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 llmx-core 和 llmx-impl-bailian 模块中添加 spring-cloud-starter-bootstrap 依赖 - 更新 gradle/libs.versions.toml 文件,添加 springCloudStarter-bootstrap 依赖项 - 修改 application.yml 和 bootstrap.yml 文件,设置 spring.profiles.active 为 dev -移除 nacos 配置导入语句 --- build.gradle.kts | 1 + gradle/libs.versions.toml | 2 +- llmx-core/llmx-core-service/build.gradle.kts | 2 +- .../llmx-core-service/src/main/resources/application-test.yml | 1 - .../src/main/resources/{nacos-test.yml => bootstrap-test.yml} | 0 llmx-core/llmx-core-service/src/main/resources/bootstrap.yml | 3 +++ .../llmx-impl-bailian/src/main/resources/application-test.yml | 4 ---- .../llmx-impl-bailian/src/main/resources/application.yml | 2 ++ .../src/main/resources/{nacos-test.yml => bootstrap-test.yml} | 0 llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap.yml | 3 +++ 10 files changed, 11 insertions(+), 7 deletions(-) rename llmx-core/llmx-core-service/src/main/resources/{nacos-test.yml => bootstrap-test.yml} (100%) create mode 100644 llmx-core/llmx-core-service/src/main/resources/bootstrap.yml rename llmx-impl/llmx-impl-bailian/src/main/resources/{nacos-test.yml => bootstrap-test.yml} (100%) create mode 100644 llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap.yml diff --git a/build.gradle.kts b/build.gradle.kts index f685e60..320eca6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -78,6 +78,7 @@ subprojects { // Nacos 服务发现和配置 implementation(libs.springCloudStarter.alibaba.nacos.discovery) implementation(libs.springCloudStarter.alibaba.nacos.config) + implementation(libs.springCloudStarter.bootstrap) // 核心spi依赖 implementation(project(Modules.Core.SPI)) // okHttp依赖 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d3f400a..de1f6f7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -45,7 +45,7 @@ springCloudStarter-alibaba-nacos-discovery = { group = "com.alibaba.cloud", name springCloudStarter-alibaba-nacos-config = { group = "com.alibaba.cloud", name = "spring-cloud-starter-alibaba-nacos-config", version.ref = "spring-cloud-starter-alibaba-nacos-discovery-version" } springCloudStarter-loadbalancer = { group = "org.springframework.cloud", name = "spring-cloud-starter-loadbalancer" } springCloudStarter-openfeign = { group = "org.springframework.cloud", name = "spring-cloud-starter-openfeign" } - +springCloudStarter-bootstrap = { group = "org.springframework.cloud", name = "spring-cloud-starter-bootstrap" } # SpringBootStarter springBootStarter-webflux = { group = "org.springframework.boot", name = "spring-boot-starter-webflux" } springBootStarter-web = { group = "org.springframework.boot", name = "spring-boot-starter-web" } diff --git a/llmx-core/llmx-core-service/build.gradle.kts b/llmx-core/llmx-core-service/build.gradle.kts index c8c72af..8116df6 100644 --- a/llmx-core/llmx-core-service/build.gradle.kts +++ b/llmx-core/llmx-core-service/build.gradle.kts @@ -4,10 +4,10 @@ extra { setProperty(ProjectFlags.USE_SPRING_CLOUD_BOM,true) } dependencies { - val libs = rootProject.libs // Nacos 服务发现和配置 implementation(libs.springCloudStarter.alibaba.nacos.discovery) implementation(libs.springCloudStarter.alibaba.nacos.config) + implementation(libs.springCloudStarter.bootstrap) // WebClient 和 Spring Cloud LoadBalancer implementation(libs.springBootStarter.webflux) diff --git a/llmx-core/llmx-core-service/src/main/resources/application-test.yml b/llmx-core/llmx-core-service/src/main/resources/application-test.yml index 3e862cb..3ef3967 100644 --- a/llmx-core/llmx-core-service/src/main/resources/application-test.yml +++ b/llmx-core/llmx-core-service/src/main/resources/application-test.yml @@ -3,7 +3,6 @@ server: spring: config: import: - - classpath:nacos-test.yml - nacos:llmx-core-service.yml?namespace=1a32d4f4-469a-4e10-ba3b-ce1bc6ba8cc9&group=test diff --git a/llmx-core/llmx-core-service/src/main/resources/nacos-test.yml b/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml similarity index 100% rename from llmx-core/llmx-core-service/src/main/resources/nacos-test.yml rename to llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml diff --git a/llmx-core/llmx-core-service/src/main/resources/bootstrap.yml b/llmx-core/llmx-core-service/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..3d7808a --- /dev/null +++ b/llmx-core/llmx-core-service/src/main/resources/bootstrap.yml @@ -0,0 +1,3 @@ +spring: + profiles: + active: dev diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml index c475634..ba3f858 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml @@ -3,8 +3,4 @@ server: spring: config: import: - - classpath:nacos-test.yml - nacos:llmx-impl-bailian.yml?namespace=da45f3a6-e7d0-4d92-b075-776adea07d6d&group=test - application: - name: llmx-impl-bailian - diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/application.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/application.yml index caf4dfc..66ff8f8 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/application.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/application.yml @@ -1,3 +1,5 @@ spring: + application: + name: llmx-impl-bailian profiles: active: dev \ No newline at end of file diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/nacos-test.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml similarity index 100% rename from llmx-impl/llmx-impl-bailian/src/main/resources/nacos-test.yml rename to llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..3d7808a --- /dev/null +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap.yml @@ -0,0 +1,3 @@ +spring: + profiles: + active: dev -- 2.47.2 From 6794d1a0ef9b52ef39c93d3aaf734e73933e5ca8 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Sat, 10 May 2025 14:39:53 +0800 Subject: [PATCH 38/44] =?UTF-8?q?build:=20=E6=9B=B4=E6=96=B0=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E9=85=8D=E7=BD=AE=E4=BB=A5=E5=8C=85=E5=90=AB=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 build.gradle.kts 文件中添加 llmx-database服务到 entrypoint 配置- 修改 docker-compose.test.yml 文件中的容器名称,使用更通用的命名 --- build.gradle.kts | 4 ++-- docker/docker-compose.test.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 320eca6..db1e9e1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -145,7 +145,7 @@ subprojects { paths = listOf(File(rootProject.projectDir, "scripts").absolutePath) entrypoint = listOf( "/bin/sh", "-c", - "/entrypoint.sh -d llmx-nacos:8848 -c " + + "/entrypoint.sh -d llmx-nacos:8848,llmx-database:9052 -c " + "'java -cp $( cat /app/jib-classpath-file ) $( cat /app/jib-main-class-file )'" ) } @@ -157,7 +157,7 @@ subprojects { paths = listOf(File(rootProject.projectDir, "scripts").absolutePath) entrypoint = listOf( "/bin/sh", "-c", - "/entrypoint.sh -d llmx-nacos:8848 -c " + + "/entrypoint.sh -d llmx-nacos:8848,llmx-database:9052 -c " + "'java -cp $( cat /app/jib-classpath-file ) $( cat /app/jib-main-class-file )'" ) } diff --git a/docker/docker-compose.test.yml b/docker/docker-compose.test.yml index 521a8b5..4665134 100644 --- a/docker/docker-compose.test.yml +++ b/docker/docker-compose.test.yml @@ -44,7 +44,7 @@ services: restart: always llmx-core-database: image: postgres:16-alpine # 长期支持版本推荐用 16 - container_name: llmx-core-database + container_name: llmx-database restart: always ports: - "9052:5432" -- 2.47.2 From 6e2ffaf39894b2fc81807cddc6a22a622efc8c09 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Sat, 10 May 2025 14:54:42 +0800 Subject: [PATCH 39/44] =?UTF-8?q?fix(build):=20=E4=BF=AE=E6=AD=A3=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E7=AB=AF=E5=8F=A3=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 llmx-database 的端口从 9052 修改为 5432 - 更新了两个镜像构建配置中的数据库连接参数 --- build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index db1e9e1..b7b2d96 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -145,7 +145,7 @@ subprojects { paths = listOf(File(rootProject.projectDir, "scripts").absolutePath) entrypoint = listOf( "/bin/sh", "-c", - "/entrypoint.sh -d llmx-nacos:8848,llmx-database:9052 -c " + + "/entrypoint.sh -d llmx-nacos:8848,llmx-database:5432 -c " + "'java -cp $( cat /app/jib-classpath-file ) $( cat /app/jib-main-class-file )'" ) } @@ -157,7 +157,7 @@ subprojects { paths = listOf(File(rootProject.projectDir, "scripts").absolutePath) entrypoint = listOf( "/bin/sh", "-c", - "/entrypoint.sh -d llmx-nacos:8848,llmx-database:9052 -c " + + "/entrypoint.sh -d llmx-nacos:8848,llmx-database:5432 -c " + "'java -cp $( cat /app/jib-classpath-file ) $( cat /app/jib-main-class-file )'" ) } -- 2.47.2 From f3882418d9042783f65550ba9fb7606b2fe429e8 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Sat, 10 May 2025 18:43:37 +0800 Subject: [PATCH 40/44] =?UTF-8?q?build:=E9=87=8D=E6=9E=84=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E4=BE=9D=E8=B5=96=E5=B9=B6=E4=BC=98=E5=8C=96=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 llmx-core-service 和 llmx-impl-bailian 模块中的重复配置 - 更新 Nacos 配置,启用配置刷新功能 - 添加 PostgreSQL 数据库依赖 -调整 Docker Compose 配置 - 更新项目构建脚本,支持条件依赖加载 --- build.gradle.kts | 21 +++++++++++++++---- buildSrc/src/main/kotlin/ProjectFlags.kt | 2 ++ docker/docker-compose.dev.yml | 2 +- docker/docker-compose.test.yml | 6 +++--- gradle/libs.versions.toml | 4 ++++ llmx-core/llmx-core-service/build.gradle.kts | 7 ++----- .../src/main/resources/application-dev.yml | 10 --------- .../src/main/resources/bootstrap-dev.yml | 12 +++++++++-- .../src/main/resources/bootstrap-test.yml | 12 +++++------ .../src/main/resources/application-dev.yml | 14 ------------- .../src/main/resources/bootstrap-dev.yml | 12 +++++++++-- .../src/main/resources/bootstrap-test.yml | 12 +++++------ 12 files changed, 59 insertions(+), 55 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index b7b2d96..fa0737c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -24,6 +24,8 @@ allprojects { set(ProjectFlags.IS_ROOT_MODULE, false) set(ProjectFlags.USE_SPRING_BOOT_BOM, false) set(ProjectFlags.USE_LLM_IMPL_PLATFORM_DEPENDENCE, false) + set(ProjectFlags.USE_NACOS_DEPENDENCE, false) + set(ProjectFlags.USE_DAO_DEPENDENCE, false) } repositories { mavenLocal() @@ -73,12 +75,9 @@ subprojects { setProperty(ProjectFlags.USE_SPRING_BOOT_WEB, true) setProperty(ProjectFlags.USE_SPRING_CLOUD_BOM, true) setProperty(ProjectFlags.USE_LLM_KT_IMPL_DEPENDENCE, true) + setProperty(ProjectFlags.USE_NACOS_DEPENDENCE, true) } dependencies { - // Nacos 服务发现和配置 - implementation(libs.springCloudStarter.alibaba.nacos.discovery) - implementation(libs.springCloudStarter.alibaba.nacos.config) - implementation(libs.springCloudStarter.bootstrap) // 核心spi依赖 implementation(project(Modules.Core.SPI)) // okHttp依赖 @@ -88,6 +87,20 @@ subprojects { implementation(libs.forgeBoot.core.extension) } } + if(project.getPropertyByBoolean(ProjectFlags.USE_DAO_DEPENDENCE)){ + dependencies{ + runtimeOnly(libs.postgresql) + implementation(libs.springBootStarter.data.jpa) + } + } + // nacos dependence + if(project.getPropertyByBoolean(ProjectFlags.USE_NACOS_DEPENDENCE)){ + dependencies { + implementation(libs.springCloudStarter.alibaba.nacos.discovery) + implementation(libs.springCloudStarter.alibaba.nacos.config) + implementation(libs.springCloudStarter.bootstrap) + } + } // springCloudBom if (project.getPropertyByBoolean(ProjectFlags.USE_SPRING_CLOUD_BOM)) { dependencies { diff --git a/buildSrc/src/main/kotlin/ProjectFlags.kt b/buildSrc/src/main/kotlin/ProjectFlags.kt index a64e694..ba8c4cd 100644 --- a/buildSrc/src/main/kotlin/ProjectFlags.kt +++ b/buildSrc/src/main/kotlin/ProjectFlags.kt @@ -4,6 +4,8 @@ object ProjectFlags { const val USE_SPRING_CLOUD_BOM = "useSpringCloudBom" const val USE_LLM_KT_IMPL_DEPENDENCE = "useLLMKtImplDependence" const val IS_ROOT_MODULE = "isRootModule" + const val USE_NACOS_DEPENDENCE = "useNacosDependence" + const val USE_DAO_DEPENDENCE = "useDaoDependence" /** * 使用实现服务第三方平台依赖 diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml index 6faec0b..9576670 100644 --- a/docker/docker-compose.dev.yml +++ b/docker/docker-compose.dev.yml @@ -8,7 +8,7 @@ services: networks: - llmx-net environment: - POSTGRES_DB: llmx_core + POSTGRES_DB: llmx_db POSTGRES_USER: llmx POSTGRES_PASSWORD: L4s6f9y3, volumes: diff --git a/docker/docker-compose.test.yml b/docker/docker-compose.test.yml index 4665134..2b22640 100644 --- a/docker/docker-compose.test.yml +++ b/docker/docker-compose.test.yml @@ -4,9 +4,9 @@ services: container_name: llmx-nacos restart: always ports: - - "9001:8848" - - "9053:9848" - - "9054:9849" + - "8848:8848" + - "9848:9848" + - "9849:9849" networks: - llmx-net-test environment: diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index de1f6f7..61f44af 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,6 +9,7 @@ forgeBoot-version = "1.3.0-SNAPSHOT" okHttp-version = "4.12.0" jib-version = "3.4.2" org-reactivestreams-reactiveStreams-version = "1.0.4" +postgresql-version = "42.7.4" [plugins] # 应用 Java 插件,提供基本的 Java 代码编译和构建能力 java = { id = "java" } @@ -50,6 +51,7 @@ springCloudStarter-bootstrap = { group = "org.springframework.cloud", name = "sp springBootStarter-webflux = { group = "org.springframework.boot", name = "spring-boot-starter-webflux" } springBootStarter-web = { group = "org.springframework.boot", name = "spring-boot-starter-web" } springBootStarter-test = { group = "org.springframework.boot", name = "spring-boot-starter-test" } +springBootStarter-data-jpa = { group = "org.springframework.boot", name = "spring-boot-starter-data-jpa" } junitPlatform-launcher = { group = "org.junit.platform", name = "junit-platform-launcher" } @@ -67,4 +69,6 @@ jackson-databind={group="com.fasterxml.jackson.core", name="jackson-databind"} jackson-annotations={group="com.fasterxml.jackson.core", name="jackson-annotations"} jackson-datatype-jsr310={group="com.fasterxml.jackson.datatype", name="jackson-datatype-jsr310"} jackson-module-kotlin={group="com.fasterxml.jackson.module", name="jackson-module-kotlin"} + +postgresql = { module = "org.postgresql:postgresql", version.ref = "postgresql-version" } [bundles] diff --git a/llmx-core/llmx-core-service/build.gradle.kts b/llmx-core/llmx-core-service/build.gradle.kts index 8116df6..24c0ba8 100644 --- a/llmx-core/llmx-core-service/build.gradle.kts +++ b/llmx-core/llmx-core-service/build.gradle.kts @@ -2,13 +2,10 @@ extra { // 开启springboot setProperty(ProjectFlags.USE_SPRING_BOOT_WEB, true) setProperty(ProjectFlags.USE_SPRING_CLOUD_BOM,true) + setProperty(ProjectFlags.USE_NACOS_DEPENDENCE, true) + setProperty(ProjectFlags.USE_DAO_DEPENDENCE, true) } dependencies { - // Nacos 服务发现和配置 - implementation(libs.springCloudStarter.alibaba.nacos.discovery) - implementation(libs.springCloudStarter.alibaba.nacos.config) - implementation(libs.springCloudStarter.bootstrap) - // WebClient 和 Spring Cloud LoadBalancer implementation(libs.springBootStarter.webflux) implementation(libs.springCloudStarter.loadbalancer) diff --git a/llmx-core/llmx-core-service/src/main/resources/application-dev.yml b/llmx-core/llmx-core-service/src/main/resources/application-dev.yml index d5844fb..31fbee8 100644 --- a/llmx-core/llmx-core-service/src/main/resources/application-dev.yml +++ b/llmx-core/llmx-core-service/src/main/resources/application-dev.yml @@ -1,14 +1,4 @@ server: port: 8081 -spring: - config: - import: classpath:bootstrap-dev.yml -llmx: - model-route: - modelServiceMap: - qwen-turbo: llmx-impl-baiLian - qwen-max: llmx-impl-baiLian - qwen-plus: llmx-impl-baiLian - qwen-vl-max-latest: llmx-impl-baiLian diff --git a/llmx-core/llmx-core-service/src/main/resources/bootstrap-dev.yml b/llmx-core/llmx-core-service/src/main/resources/bootstrap-dev.yml index 37654f9..9559f7f 100644 --- a/llmx-core/llmx-core-service/src/main/resources/bootstrap-dev.yml +++ b/llmx-core/llmx-core-service/src/main/resources/bootstrap-dev.yml @@ -2,11 +2,19 @@ spring: cloud: nacos: username: nacos - password: L4s6f9y3 + password: L4s6f9y3, server-addr: 49.235.96.75:8848 ip: 192.168.1.100 discovery: server-addr: ${spring.cloud.nacos.server-addr} username: ${spring.cloud.nacos.username} password: ${spring.cloud.nacos.password} - ip: ${spring.cloud.nacos.ip} \ No newline at end of file + ip: ${spring.cloud.nacos.ip} + config: + file-extension: yaml + namespace: a17d57ec-4fd9-44c7-a617-7f6003a0b332 + refresh-enabled: true + extension-configs: + - data-id: ${spring.application.name}-${spring.profiles.active}.yaml + refresh: true + group: ${spring.application.name} \ No newline at end of file diff --git a/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml b/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml index 143c1eb..9a85cbf 100644 --- a/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml +++ b/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml @@ -9,12 +9,10 @@ spring: username: ${spring.cloud.nacos.username} password: ${spring.cloud.nacos.password} config: - server-addr: ${spring.cloud.nacos.server-addr} - username: ${spring.cloud.nacos.username} - password: ${spring.cloud.nacos.password} file-extension: yaml - namespace: 1a32d4f4-469a-4e10-ba3b-ce1bc6ba8cc9 - shared-configs: - - data-id: llmx-core-service.yml + namespace: 54a289f7-5f4a-4c83-8a0a-199defa35458 + refresh-enabled: true + extension-configs: + - data-id: ${spring.application.name}-${spring.profiles.active}.yaml refresh: true - group: test \ No newline at end of file + group: ${spring.application.name} \ No newline at end of file diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/application-dev.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/application-dev.yml index 47077e1..d7fe24e 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/application-dev.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/application-dev.yml @@ -9,17 +9,3 @@ spring: nacos: discovery: server-addr: 49.235.96.75:8848 # Nacos 服务地址 -# 阿里云配置 -aliyun: - # DashScope服务配置 - dash: - # 访问凭证配置 - scope: - access-key-id: LTAI5tHiA2Ry3XTAfoSEJW6z # 阿里云访问密钥ID - access-key-secret: K5sf4FxZZuUgLEFnyfepBfMqFGmDcD # 阿里云访问密钥密钥 - endpoint: bailian.cn-beijing.aliyuncs.com # 阿里云服务端点 - workspace-id: llm-axfkuqft05uzbjpi # 工作区ID - api-key: sk-78af4dd964a94f4cb373851064dbdc12 # API密钥 - app-id: 3fae0bbab2e54a90a37aa02cd12dd62c # 应用ID - base-url: https://dashscope.aliyuncs.com/api/v1/apps/ # 基础API URL - multimodality-url: https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-dev.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-dev.yml index 37654f9..9559f7f 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-dev.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-dev.yml @@ -2,11 +2,19 @@ spring: cloud: nacos: username: nacos - password: L4s6f9y3 + password: L4s6f9y3, server-addr: 49.235.96.75:8848 ip: 192.168.1.100 discovery: server-addr: ${spring.cloud.nacos.server-addr} username: ${spring.cloud.nacos.username} password: ${spring.cloud.nacos.password} - ip: ${spring.cloud.nacos.ip} \ No newline at end of file + ip: ${spring.cloud.nacos.ip} + config: + file-extension: yaml + namespace: a17d57ec-4fd9-44c7-a617-7f6003a0b332 + refresh-enabled: true + extension-configs: + - data-id: ${spring.application.name}-${spring.profiles.active}.yaml + refresh: true + group: ${spring.application.name} \ No newline at end of file diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml index 7b2d7f2..9a85cbf 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml @@ -9,12 +9,10 @@ spring: username: ${spring.cloud.nacos.username} password: ${spring.cloud.nacos.password} config: - server-addr: ${spring.cloud.nacos.server-addr} - username: ${spring.cloud.nacos.username} - password: ${spring.cloud.nacos.password} file-extension: yaml - namespace: da45f3a6-e7d0-4d92-b075-776adea07d6d - shared-configs: - - data-id: llmx-impl-bailian.yml + namespace: 54a289f7-5f4a-4c83-8a0a-199defa35458 + refresh-enabled: true + extension-configs: + - data-id: ${spring.application.name}-${spring.profiles.active}.yaml refresh: true - group: test \ No newline at end of file + group: ${spring.application.name} \ No newline at end of file -- 2.47.2 From 636b589a9efd57d63065c2d535d8c5557fa91cd0 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Sat, 10 May 2025 19:08:05 +0800 Subject: [PATCH 41/44] =?UTF-8?q?ci:=E7=AE=80=E5=8C=96=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=B9=B6=E7=BB=9F=E4=B8=80=20Nacos=20?= =?UTF-8?q?=E9=85=8D=E7=BD=AE-=20=E7=A7=BB=E9=99=A4=E4=BA=86=20application?= =?UTF-8?q?-dev.yml=20=E5=92=8C=20application-test.yml=20=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E5=86=97=E4=BD=99=E9=85=8D=E7=BD=AE=20-=20=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E4=BA=86=20bootstrap-dev.yml=20=E5=92=8C=20bootstrap-?= =?UTF-8?q?test.yml=20=E4=B8=AD=E7=9A=84=20Nacos=20=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=20-=20=E5=9C=A8=20bootstrap=20=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E4=B8=AD=E6=B7=BB=E5=8A=A0=E4=BA=86=20common-db.yaml?= =?UTF-8?q?=20=E9=85=8D=E7=BD=AE=20-=20=E4=BF=AE=E6=94=B9=E4=BA=86=20Docke?= =?UTF-8?q?r=20Compose=20=E6=96=87=E4=BB=B6=E4=B8=AD=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker/docker-compose.test.yml | 2 +- .../src/main/resources/application-dev.yml | 4 +--- .../src/main/resources/application-test.yml | 4 ---- .../src/main/resources/bootstrap-dev.yml | 11 +++++++---- .../src/main/resources/bootstrap-test.yml | 5 ++++- .../src/main/resources/application-dev.yml | 11 +---------- .../src/main/resources/application-test.yml | 4 ---- .../src/main/resources/bootstrap-dev.yml | 6 +++--- .../src/main/resources/bootstrap-test.yml | 4 ++-- 9 files changed, 19 insertions(+), 32 deletions(-) diff --git a/docker/docker-compose.test.yml b/docker/docker-compose.test.yml index 2b22640..737ff70 100644 --- a/docker/docker-compose.test.yml +++ b/docker/docker-compose.test.yml @@ -51,7 +51,7 @@ services: networks: - llmx-net-test environment: - POSTGRES_DB: llmx_core + POSTGRES_DB: llmx_db POSTGRES_USER: llmx POSTGRES_PASSWORD: L4s6f9y3, volumes: diff --git a/llmx-core/llmx-core-service/src/main/resources/application-dev.yml b/llmx-core/llmx-core-service/src/main/resources/application-dev.yml index 31fbee8..54b155f 100644 --- a/llmx-core/llmx-core-service/src/main/resources/application-dev.yml +++ b/llmx-core/llmx-core-service/src/main/resources/application-dev.yml @@ -1,4 +1,2 @@ server: - port: 8081 - - + port: 8081 \ No newline at end of file diff --git a/llmx-core/llmx-core-service/src/main/resources/application-test.yml b/llmx-core/llmx-core-service/src/main/resources/application-test.yml index 3ef3967..8091132 100644 --- a/llmx-core/llmx-core-service/src/main/resources/application-test.yml +++ b/llmx-core/llmx-core-service/src/main/resources/application-test.yml @@ -1,8 +1,4 @@ server: port: 9002 -spring: - config: - import: - - nacos:llmx-core-service.yml?namespace=1a32d4f4-469a-4e10-ba3b-ce1bc6ba8cc9&group=test diff --git a/llmx-core/llmx-core-service/src/main/resources/bootstrap-dev.yml b/llmx-core/llmx-core-service/src/main/resources/bootstrap-dev.yml index 9559f7f..e01946d 100644 --- a/llmx-core/llmx-core-service/src/main/resources/bootstrap-dev.yml +++ b/llmx-core/llmx-core-service/src/main/resources/bootstrap-dev.yml @@ -1,15 +1,15 @@ spring: cloud: nacos: + ip: 192.168.1.100 username: nacos password: L4s6f9y3, server-addr: 49.235.96.75:8848 - ip: 192.168.1.100 discovery: - server-addr: ${spring.cloud.nacos.server-addr} + ip: ${spring.cloud.nacos.ip} username: ${spring.cloud.nacos.username} password: ${spring.cloud.nacos.password} - ip: ${spring.cloud.nacos.ip} + server-addr: ${spring.cloud.nacos.server-addr} config: file-extension: yaml namespace: a17d57ec-4fd9-44c7-a617-7f6003a0b332 @@ -17,4 +17,7 @@ spring: extension-configs: - data-id: ${spring.application.name}-${spring.profiles.active}.yaml refresh: true - group: ${spring.application.name} \ No newline at end of file + group: ${spring.application.name} + - data-id: common-db.yaml + refresh: true + group: infra \ No newline at end of file diff --git a/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml b/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml index 9a85cbf..416ac0d 100644 --- a/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml +++ b/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml @@ -15,4 +15,7 @@ spring: extension-configs: - data-id: ${spring.application.name}-${spring.profiles.active}.yaml refresh: true - group: ${spring.application.name} \ No newline at end of file + group: ${spring.application.name} + - data-id: common-db.yaml + refresh: true + group: infra \ No newline at end of file diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/application-dev.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/application-dev.yml index d7fe24e..0884131 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/application-dev.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/application-dev.yml @@ -1,11 +1,2 @@ server: - port: 8082 -spring: - config: - import: classpath:bootstrap-dev.yml - application: - name: llmx-impl-baiLian - cloud: - nacos: - discovery: - server-addr: 49.235.96.75:8848 # Nacos 服务地址 + port: 8082 \ No newline at end of file diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml index ba3f858..f9c0b55 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/application-test.yml @@ -1,6 +1,2 @@ server: port: 9003 -spring: - config: - import: - - nacos:llmx-impl-bailian.yml?namespace=da45f3a6-e7d0-4d92-b075-776adea07d6d&group=test diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-dev.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-dev.yml index 9559f7f..bb79e04 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-dev.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-dev.yml @@ -1,15 +1,15 @@ spring: cloud: nacos: + ip: 192.168.1.100 username: nacos password: L4s6f9y3, server-addr: 49.235.96.75:8848 - ip: 192.168.1.100 discovery: - server-addr: ${spring.cloud.nacos.server-addr} + ip: ${spring.cloud.nacos.ip} username: ${spring.cloud.nacos.username} password: ${spring.cloud.nacos.password} - ip: ${spring.cloud.nacos.ip} + server-addr: ${spring.cloud.nacos.server-addr} config: file-extension: yaml namespace: a17d57ec-4fd9-44c7-a617-7f6003a0b332 diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml index 9a85cbf..b163072 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml @@ -1,13 +1,13 @@ spring: cloud: nacos: - server-addr: llmx-nacos:8848 username: nacos password: L4s6f9y3, + server-addr: llmx-nacos:8848 discovery: - server-addr: ${spring.cloud.nacos.server-addr} username: ${spring.cloud.nacos.username} password: ${spring.cloud.nacos.password} + server-addr: ${spring.cloud.nacos.server-addr} config: file-extension: yaml namespace: 54a289f7-5f4a-4c83-8a0a-199defa35458 -- 2.47.2 From 07c85f6f18186d5602f59bf6eee2020fdee56eb7 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Sat, 10 May 2025 19:42:55 +0800 Subject: [PATCH 42/44] =?UTF-8?q?build(llmx-core,=20llmx-impl-bailian):=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=20Nacos=20=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 application.yml 中的 spring.application.name配置 - 在 bootstrap.yml 中添加 spring.application.name 配置- 修改 bootstrap-dev.yml 和 bootstrap-test.yml 中的 Nacos IP 地址 - 在 bootstrap-dev.yml 和 bootstrap-test.yml 中添加 group 和 namespace 配置 --- .../llmx-core-service/src/main/resources/application.yml | 2 -- .../llmx-core-service/src/main/resources/bootstrap-dev.yml | 4 +++- .../llmx-core-service/src/main/resources/bootstrap-test.yml | 2 ++ llmx-core/llmx-core-service/src/main/resources/bootstrap.yml | 2 ++ .../llmx-impl-bailian/src/main/resources/application.yml | 2 -- .../llmx-impl-bailian/src/main/resources/bootstrap-dev.yml | 4 +++- .../llmx-impl-bailian/src/main/resources/bootstrap-test.yml | 2 ++ llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap.yml | 2 ++ 8 files changed, 14 insertions(+), 6 deletions(-) diff --git a/llmx-core/llmx-core-service/src/main/resources/application.yml b/llmx-core/llmx-core-service/src/main/resources/application.yml index dd04bca..3d7808a 100644 --- a/llmx-core/llmx-core-service/src/main/resources/application.yml +++ b/llmx-core/llmx-core-service/src/main/resources/application.yml @@ -1,5 +1,3 @@ spring: - application: - name: llmx-core-service profiles: active: dev diff --git a/llmx-core/llmx-core-service/src/main/resources/bootstrap-dev.yml b/llmx-core/llmx-core-service/src/main/resources/bootstrap-dev.yml index e01946d..0e4cf07 100644 --- a/llmx-core/llmx-core-service/src/main/resources/bootstrap-dev.yml +++ b/llmx-core/llmx-core-service/src/main/resources/bootstrap-dev.yml @@ -1,7 +1,7 @@ spring: cloud: nacos: - ip: 192.168.1.100 + ip: 192.168.1.8 username: nacos password: L4s6f9y3, server-addr: 49.235.96.75:8848 @@ -10,6 +10,8 @@ spring: username: ${spring.cloud.nacos.username} password: ${spring.cloud.nacos.password} server-addr: ${spring.cloud.nacos.server-addr} + group: llmx-${spring.profiles.active} + namespace: a17d57ec-4fd9-44c7-a617-7f6003a0b332 config: file-extension: yaml namespace: a17d57ec-4fd9-44c7-a617-7f6003a0b332 diff --git a/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml b/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml index 416ac0d..2870fad 100644 --- a/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml +++ b/llmx-core/llmx-core-service/src/main/resources/bootstrap-test.yml @@ -8,6 +8,8 @@ spring: server-addr: ${spring.cloud.nacos.server-addr} username: ${spring.cloud.nacos.username} password: ${spring.cloud.nacos.password} + group: llmx-${spring.profiles.active} + namespace: 54a289f7-5f4a-4c83-8a0a-199defa35458 config: file-extension: yaml namespace: 54a289f7-5f4a-4c83-8a0a-199defa35458 diff --git a/llmx-core/llmx-core-service/src/main/resources/bootstrap.yml b/llmx-core/llmx-core-service/src/main/resources/bootstrap.yml index 3d7808a..dd04bca 100644 --- a/llmx-core/llmx-core-service/src/main/resources/bootstrap.yml +++ b/llmx-core/llmx-core-service/src/main/resources/bootstrap.yml @@ -1,3 +1,5 @@ spring: + application: + name: llmx-core-service profiles: active: dev diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/application.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/application.yml index 66ff8f8..caf4dfc 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/application.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/application.yml @@ -1,5 +1,3 @@ spring: - application: - name: llmx-impl-bailian profiles: active: dev \ No newline at end of file diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-dev.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-dev.yml index bb79e04..d23f760 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-dev.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-dev.yml @@ -1,7 +1,7 @@ spring: cloud: nacos: - ip: 192.168.1.100 + ip: 192.168.1.8 username: nacos password: L4s6f9y3, server-addr: 49.235.96.75:8848 @@ -10,6 +10,8 @@ spring: username: ${spring.cloud.nacos.username} password: ${spring.cloud.nacos.password} server-addr: ${spring.cloud.nacos.server-addr} + group: llmx-${spring.profiles.active} + namespace: a17d57ec-4fd9-44c7-a617-7f6003a0b332 config: file-extension: yaml namespace: a17d57ec-4fd9-44c7-a617-7f6003a0b332 diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml index b163072..3998b26 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-test.yml @@ -8,6 +8,8 @@ spring: username: ${spring.cloud.nacos.username} password: ${spring.cloud.nacos.password} server-addr: ${spring.cloud.nacos.server-addr} + group: llmx-${spring.profiles.active} + namespace: 54a289f7-5f4a-4c83-8a0a-199defa35458 config: file-extension: yaml namespace: 54a289f7-5f4a-4c83-8a0a-199defa35458 diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap.yml index 3d7808a..4e63fe8 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap.yml @@ -1,3 +1,5 @@ spring: + application: + name: llmx-impl-bailian profiles: active: dev -- 2.47.2 From 484ffa4f1395742c52a21594ffc5fedd52a8dfc3 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Sat, 10 May 2025 21:46:35 +0800 Subject: [PATCH 43/44] =?UTF-8?q?feat(core):=20=E9=87=8D=E6=9E=84=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E8=B7=AF=E7=94=B1=E7=AE=A1=E7=90=86=E5=B9=B6=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=20Nacos=20=E9=85=8D=E7=BD=AE-=20=E7=A7=BB=E9=99=A4=20?= =?UTF-8?q?ModelProperties=20=E7=B1=BB=EF=BC=8C=E4=BD=BF=E7=94=A8=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E5=AD=98=E5=82=A8=E6=A8=A1=E5=9E=8B=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E6=98=A0=E5=B0=84-=20=E6=96=B0=E5=A2=9E=20ModelRouteM?= =?UTF-8?q?apping=20=E5=AE=9E=E4=BD=93=E7=B1=BB=E5=92=8C=20ModelRouteMappi?= =?UTF-8?q?ngRepository=20=E6=8E=A5=E5=8F=A3=20-=20=E6=9B=B4=E6=96=B0=20Mo?= =?UTF-8?q?delRouteManager=20=E7=B1=BB=EF=BC=8C=E4=BD=BF=E7=94=A8=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E6=9F=A5=E8=AF=A2=E6=A8=A1=E5=9E=8B=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E4=BF=A1=E6=81=AF-=20=E4=BF=AE=E6=94=B9=20Nacos=20?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=EF=BC=8C=E5=B0=86=20IP=20=E5=9C=B0=E5=9D=80?= =?UTF-8?q?=E4=BB=8E=20192.168.1.8=20=E6=94=B9=E4=B8=BA=20127.0.0.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/service/config/AppConfiguration.kt | 2 - .../core/service/config/ModelProperties.kt | 21 ------ .../service/domain/model/ModelRouteMapping.kt | 74 +++++++++++++++++++ .../core/service/manager/ModelRouteManager.kt | 11 +-- .../ModelRouteMappingRepository.kt | 10 +++ .../src/main/resources/bootstrap-dev.yml | 2 +- .../src/main/resources/bootstrap-dev.yml | 2 +- 7 files changed, 92 insertions(+), 30 deletions(-) delete mode 100644 llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/ModelProperties.kt create mode 100644 llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/domain/model/ModelRouteMapping.kt create mode 100644 llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/repositories/ModelRouteMappingRepository.kt diff --git a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/AppConfiguration.kt b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/AppConfiguration.kt index 6d400c3..bb50d8c 100644 --- a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/AppConfiguration.kt +++ b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/AppConfiguration.kt @@ -1,6 +1,5 @@ package org.jcnc.llmx.core.service.config -import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.cloud.client.loadbalancer.LoadBalanced import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @@ -13,7 +12,6 @@ import org.springframework.web.reactive.function.client.WebClient * @author gewuyou */ @Configuration -@EnableConfigurationProperties(ModelProperties::class) open class AppConfiguration { /** * 创建一个配置了负载均衡的WebClient构建器 diff --git a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/ModelProperties.kt b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/ModelProperties.kt deleted file mode 100644 index 4e705c1..0000000 --- a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/config/ModelProperties.kt +++ /dev/null @@ -1,21 +0,0 @@ -package org.jcnc.llmx.core.service.config - -import org.springframework.boot.context.properties.ConfigurationProperties -import org.springframework.cloud.context.config.annotation.RefreshScope - -/** - *模型属性 - * - * @since 2025-04-26 18:01:48 - * @author gewuyou - */ -@ConfigurationProperties(prefix = "llmx.model-route") -@RefreshScope -open class ModelProperties { - /** - * 模型名前缀 -> 服务名映射 - * 该映射表存储了模型名前缀与服务名的对应关系,用于快速查找模型对应的服务 - * 例:openai -> llmhub-impl-openai - */ - var modelServiceMap: Map = emptyMap() -} \ No newline at end of file diff --git a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/domain/model/ModelRouteMapping.kt b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/domain/model/ModelRouteMapping.kt new file mode 100644 index 0000000..a4dea5c --- /dev/null +++ b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/domain/model/ModelRouteMapping.kt @@ -0,0 +1,74 @@ +package org.jcnc.llmx.core.service.domain.model + +import jakarta.persistence.* +import org.hibernate.annotations.ColumnDefault +import java.time.OffsetDateTime + +/** + * 表示模型与其路由信息之间的映射关系。 + * 该类用于定义模型与对应服务之间的关联, + * 包括相关的描述信息和状态信息。 + * + * 使用注解来定义表名、主键生成策略以及字段与数据库列的映射关系。 + */ +@Entity +@Table(name = "model_route_mapping", schema = "core") +open class ModelRouteMapping { + /** + * 映射关系的唯一标识符。 + * 使用序列生成器来自动生成ID。 + */ + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "model_route_mapping_id_gen") + @SequenceGenerator( + name = "model_route_mapping_id_gen", + sequenceName = "model_route_mapping_id_seq", + allocationSize = 1 + ) + @Column(name = "id", nullable = false) + open var id: Long? = null + + /** + * 模型名称。 + * 用于标识与路由信息相关联的模型。 + */ + @Column(name = "model", nullable = false, length = 50) + open lateinit var model: String + + /** + * 对应的服务名称。 + * 表示该模型所关联的具体服务实例。 + */ + @Column(name = "service_name", nullable = false, length = 50) + open lateinit var serviceName: String + + /** + * 映射描述。 + * 提供有关映射的额外信息,便于理解和维护。 + */ + @Column(name = "description", length = 150) + open var description: String? = null + + /** + * 映射状态。 + * 表示当前映射是否启用。默认情况下,新映射是启用的。 + */ + @ColumnDefault("true") + @Column(name = "enabled") + open var enabled: Boolean=true + + /** + * 创建时间。 + * 默认为创建新映射时的当前时间戳。 + */ + @ColumnDefault("CURRENT_TIMESTAMP") + @Column(name = "create_at", nullable = false) + open var createAt: OffsetDateTime? = null + + /** + * 最后更新时间。 + * 记录映射信息的最后修改时间。 + */ + @Column(name = "update_at") + open var updateAt: OffsetDateTime? = null +} diff --git a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/manager/ModelRouteManager.kt b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/manager/ModelRouteManager.kt index 88324e1..3c59b71 100644 --- a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/manager/ModelRouteManager.kt +++ b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/manager/ModelRouteManager.kt @@ -2,7 +2,7 @@ package org.jcnc.llmx.core.service.manager import com.gewuyou.forgeboot.core.extension.log -import org.jcnc.llmx.core.service.config.ModelProperties +import org.jcnc.llmx.core.service.repositories.ModelRouteMappingRepository import org.springframework.stereotype.Component /** @@ -16,7 +16,7 @@ import org.springframework.stereotype.Component */ @Component class ModelRouteManager( - private val modelProperties: ModelProperties + private val modelRouteMappingRepository: ModelRouteMappingRepository, ) { /** * 根据模型名查找对应服务 @@ -29,10 +29,11 @@ class ModelRouteManager( * @throws IllegalArgumentException 如果模型名不匹配任何已知前缀,抛出此异常 */ fun resolveServiceName(model: String): String { - val modelServiceMap = modelProperties.modelServiceMap + val modelServiceMap = modelRouteMappingRepository.findAllByEnabled(true) + .associate { it.model to it.serviceName } log.info("modelServiceMap: $modelServiceMap") - for ((prefix, serviceName) in modelServiceMap) { - if (model.startsWith(prefix)) { + for ((model, serviceName) in modelServiceMap) { + if (model.startsWith(model)) { return serviceName } } diff --git a/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/repositories/ModelRouteMappingRepository.kt b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/repositories/ModelRouteMappingRepository.kt new file mode 100644 index 0000000..cf4b7ec --- /dev/null +++ b/llmx-core/llmx-core-service/src/main/kotlin/org/jcnc/llmx/core/service/repositories/ModelRouteMappingRepository.kt @@ -0,0 +1,10 @@ +package org.jcnc.llmx.core.service.repositories + +import org.jcnc.llmx.core.service.domain.model.ModelRouteMapping +import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.data.jpa.repository.JpaSpecificationExecutor + +interface ModelRouteMappingRepository : JpaRepository, + JpaSpecificationExecutor { + fun findAllByEnabled(isEnabled: Boolean): List +} \ No newline at end of file diff --git a/llmx-core/llmx-core-service/src/main/resources/bootstrap-dev.yml b/llmx-core/llmx-core-service/src/main/resources/bootstrap-dev.yml index 0e4cf07..62646f9 100644 --- a/llmx-core/llmx-core-service/src/main/resources/bootstrap-dev.yml +++ b/llmx-core/llmx-core-service/src/main/resources/bootstrap-dev.yml @@ -1,7 +1,7 @@ spring: cloud: nacos: - ip: 192.168.1.8 + ip: 127.0.0.1 username: nacos password: L4s6f9y3, server-addr: 49.235.96.75:8848 diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-dev.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-dev.yml index d23f760..2b145bd 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-dev.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-dev.yml @@ -1,7 +1,7 @@ spring: cloud: nacos: - ip: 192.168.1.8 + ip: 127.0.0.1 username: nacos password: L4s6f9y3, server-addr: 49.235.96.75:8848 -- 2.47.2 From 222208862cbacf8dc06bd05024d820a872973894 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Sun, 11 May 2025 11:44:34 +0800 Subject: [PATCH 44/44] =?UTF-8?q?ci/cd:=20=E6=B7=BB=E5=8A=A0=20master=20?= =?UTF-8?q?=E5=88=86=E6=94=AF=E7=9A=84=E6=8C=81=E7=BB=AD=E9=9B=86=E6=88=90?= =?UTF-8?q?=E5=92=8C=E9=83=A8=E7=BD=B2=E6=B5=81=E6=B0=B4=E7=BA=BF-=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=20bootstrap-master.yml=20=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=EF=BC=8C=E7=94=A8=E4=BA=8E=20Nacos=20?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=92=8C=E5=8F=91=E7=8E=B0=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=20-=20=E7=A7=BB=E9=99=A4=20application-master.yml=20=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=20Nacos=20=E7=9B=B8=E5=85=B3=E9=85=8D=E7=BD=AE=20-=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=20Docker=20Compose=20=E6=96=87=E4=BB=B6?= =?UTF-8?q?=EF=BC=8C=E7=94=A8=E4=BA=8E=E5=AE=9A=E4=B9=89=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E9=83=A8=E7=BD=B2=E7=BB=93=E6=9E=84=20-=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=20Gitea=20Actions=20=E5=B7=A5=E4=BD=9C=E6=B5=81=EF=BC=8C?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BB=8E=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E5=88=B0=E9=83=A8=E7=BD=B2=E7=9A=84=E8=87=AA=E5=8A=A8=E5=8C=96?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=20-=20=E9=85=8D=E7=BD=AE=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E7=AD=96=E7=95=A5=EF=BC=8C=E6=8F=90=E9=AB=98=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E6=95=88=E7=8E=87=20-=20=E6=B7=BB=E5=8A=A0=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E9=83=A8=E7=BD=B2=E6=AD=A5=E9=AA=A4=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=86=85=E9=83=A8=E5=92=8C=E6=96=B0=E5=8A=A0=E5=9D=A1=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=99=A8=E7=9A=84=E8=87=AA=E5=8A=A8=E9=83=A8=E7=BD=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/deploy.master.yml | 219 ++++++++++++++++++ docker/docker-compose.master.agent.yml | 32 +++ docker/docker-compose.master.main.yml | 48 ++++ .../src/main/resources/application-master.yml | 7 +- .../src/main/resources/bootstrap-master.yml | 23 ++ .../src/main/resources/application-master.yml | 22 +- .../src/main/resources/bootstrap-master.yml | 20 ++ 7 files changed, 344 insertions(+), 27 deletions(-) create mode 100644 .gitea/workflows/deploy.master.yml create mode 100644 docker/docker-compose.master.agent.yml create mode 100644 docker/docker-compose.master.main.yml create mode 100644 llmx-core/llmx-core-service/src/main/resources/bootstrap-master.yml create mode 100644 llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-master.yml diff --git a/.gitea/workflows/deploy.master.yml b/.gitea/workflows/deploy.master.yml new file mode 100644 index 0000000..e832654 --- /dev/null +++ b/.gitea/workflows/deploy.master.yml @@ -0,0 +1,219 @@ +name: CI/CD Pipeline + +on: + push: + branches: + - master # 触发构建的分支 + +env: + # ========== 环境变量配置 ========== + DOCKER_REGISTRY_URL: ${{vars.DOCKER_REGISTRY_URL}} # 私有Docker镜像仓库地址 + INTERNAL_DOCKER_REGISTRY_URL: ${{vars.INTERNAL_DOCKER_REGISTRY_URL}} + PROJECT_NAME: llmx # 项目名称 + MAIN_COMPOSE_FILE: docker/docker-compose.master.main.yml + AGENT_COMPOSE_FILE: docker/docker-compose.master.agent.yml + SERVER_PASSWORD: ${{ secrets.SERVER_PASSWORD }} # 仓库密码 + JCNC_GITEA_URL: ${{vars.SERVER_GITEA_URL}} # Gitea地址 + RUNNER_TOOL_CACHE: /opt/tools-cache # 工具缓存目录 + GRADLE_CACHE_KEY: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + SPRING_PROFILES_ACTIVE: master + INTERNAL_SERVER_HOST: ${{ vars.INTERNAL_SERVER_HOST }} + INTERNAL_SERVER_PROT: ${{ vars.INTERNAL_SERVER_PROT }} + SINGAPORE_SERVER_HOST: ${{ vars.SINGAPORE_SERVER_HOST }} + SSH_PROT: ${{ vars.SSH_PROT }} +jobs: + build-and-deploy: + runs-on: ubuntu-latest + container: + image: jcnc/act-runner:latest # 使用自定义Runner镜像 + options: --user root # 以root用户运行(需要docker权限) + + steps: + # ========== 1. 代码检出 ========== + - name: 🛒 Checkout source code + uses: ${{env.JCNC_GITEA_URL}}/actions/checkout@v4 + with: + fetch-depth: 0 # 获取完整git历史(某些插件需要) + + # ========== 2. Docker环境准备 ========== + - name: 🐳 Install Docker Environment + run: | + echo "=== 检查Docker安装状态 ===" + if ! command -v docker >/dev/null; then + echo "❌ Docker未安装,开始安装..." + curl -fsSL https://get.docker.com | sh | tee docker-install.log + echo "✅ Docker安装完成" + echo "✅ Docker Compose安装完成" + else + echo "ℹ️ Docker已安装,版本: $(docker -v)" + echo "ℹ️ Docker Compose已安装,版本: $(docker compose version)" + fi + + # ========== 3. Gradle环境准备 ========== + - name: 🔧 Prepare Gradle Environment + run: | + echo "赋予gradlew执行权限..." + chmod +x gradlew + echo "当前目录结构:" + ls -al + # ========== 4. 恢复缓存 ========== + - name: 📦 Use Cache + id: cache + uses: ${{env.JCNC_GITEA_URL}}/actions/cache/restore@v4 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + ~/.cache + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + env: + ACTIONS_RUNNER_DEBUG: true # 启用缓存调试输出 + + - name: ⚙️ Setup Gradle + uses: ${{env.JCNC_GITEA_URL}}/gradle/actions/setup-gradle@v4 + with: + gradle-version: wrapper # 使用项目自带的gradle-wrapper + - name: 📦 Copy Compose File to Internal Server + uses: ${{env.JCNC_GITEA_URL}}/appleboy/scp-action@v1 + with: + host: ${{ env.INTERNAL_SERVER_HOST }} + port: $INTERNAL_SERVER_PROT + username: root + password: ${{ secrets.INTERNAL_SERVER_PASSWORD }} + source: $MAIN_COMPOSE_FILE + target: "/home/luke/deploy/llmx/docker-compose.master.yml" + - name: 📦 Copy Compose File to Singapore Server + uses: ${{env.JCNC_GITEA_URL}}/appleboy/scp-action@v1 + with: + host: $SINGAPORE_SERVER_HOST + port: $SSH_PROT + username: root + password: ${{ secrets.SINGAPORE_SERVER_PASSWORD }} + source: $AGENT_COMPOSE_FILE + target: "/home/deploy/llmx/docker-compose.master.yml" + # ========== 5. 构建阶段 ========== + - name: 🏗️ Build with Jib + run: | + echo "开始构建Docker镜像..." + ./gradlew jib --stacktrace --build-cache --info -Dorg.gradle.caching=true -Dorg.gradle.jvmargs="-Xmx2g -Xms2g -XX:MaxMetaspaceSize=1g" | tee build.log + + echo "=== 镜像构建结果 ===" + docker images | grep ${{ env.PROJECT_NAME }} || true + - name: 🛑 Stop Gradle Daemon + run: | + echo "停止Gradle守护进程..." + ./gradlew --stop + echo "剩余Java进程:" + ps aux | grep java || true + - name: 🛰️ Tag & Push to Internal Registry + run: | + echo "标记并推送镜像到内部服务器..." + docker tag ${{env.DOCKER_REGISTRY_URL}}/llmx-core-service:latest ${{env.INTERNAL_DOCKER_REGISTRY_URL}}/llmx-core-service:latest + docker tag ${{env.DOCKER_REGISTRY_URL}}/llmx-impl-bailian:latest ${{env.INTERNAL_DOCKER_REGISTRY_URL}}/llmx-impl-bailian:latest + + echo "${{ secrets.INTERNAL_DOCKER_REGISTRY_PASSWORD }}" | docker login ${{env.INTERNAL_DOCKER_REGISTRY_URL}} -u root --password-stdin + docker push ${{env.INTERNAL_DOCKER_REGISTRY_URL}}/llmx-core-service:latest + docker push ${{env.INTERNAL_DOCKER_REGISTRY_URL}}/llmx-impl-bailian:latest + docker logout ${{env.INTERNAL_DOCKER_REGISTRY_URL}} + - name: 🛰️ Tag & Push to Singapore Registry + run: | + echo "标记并推送镜像到内部服务器..." + docker tag ${{env.DOCKER_REGISTRY_URL}}/llmx-core-service:latest ${{env.SINGAPORE_DOCKER_REGISTRY_URL}}/llmx-core-service:latest + docker tag ${{env.DOCKER_REGISTRY_URL}}/llmx-impl-bailian:latest ${{env.SINGAPORE_DOCKER_REGISTRY_URL}}/llmx-impl-bailian:latest + + echo "${{ secrets.INTERNAL_DOCKER_REGISTRY_PASSWORD }}" | docker login ${{env.SINGAPORE_DOCKER_REGISTRY_URL}} -u root --password-stdin + docker push ${{env.SINGAPORE_DOCKER_REGISTRY_URL}}/llmx-core-service:latest + docker push ${{env.SINGAPORE_DOCKER_REGISTRY_URL}}/llmx-impl-bailian:latest + docker logout ${{env.SINGAPORE_DOCKER_REGISTRY_URL}} + # ========== 6. 保存缓存 ========== + - name: 📦 Save Cache + id: cache + uses: ${{env.JCNC_GITEA_URL}}/actions/cache/save@v4 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + ~/.cache + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + env: + ACTIONS_RUNNER_DEBUG: true # 启用缓存调试输出 + - name: 🧼 Cleanup Dangling Images + run: | + echo "开始清理无标签镜像..." + docker image prune -f + remote-internal-deploy: + needs: build-and-deploy + runs-on: ubuntu-latest + container: + image: jcnc/act-runner:latest # 使用自定义Runner镜像 + options: --user root # 以root用户运行(需要docker权限) + steps: + - name: ✈️ Deploy on Internal Server + uses: ${{env.JCNC_GITEA_URL}}/appleboy/ssh-action@v1 + with: + host: $INTERNAL_SERVER_HOST + port: $INTERNAL_SERVER_PROT + username: root + password: ${{ secrets.INTERNAL_SERVER_PASSWORD }} + script: | + cd /home/luke/deploy/llmx + echo "准备部署环境..." + chmod +x docker-compose.master.yml + echo "当前Docker状态:" + docker ps -a + echo "清理旧容器..." + docker compose -f docker-compose.master.yml down --remove-orphans + echo "清理后Docker状态:" + docker ps -a + echo "拉取最新镜像..." + docker compose -f docker-compose.master.yml pull + echo "启动新服务..." + docker compose -f docker-compose.master.yml up -d + docker compose ps + echo "=== 服务状态检查 ===" + docker compose -f docker-compose.master.yml ps + echo "开始清理无标签镜像..." + docker image prune -f + echo "清理docker-compose.master.yml" + rm -rf docker-compose.master.yml + remote-singapore-deploy: + needs: build-and-deploy + runs-on: ubuntu-latest + container: + image: jcnc/act-runner:latest # 使用自定义Runner镜像 + options: --user root # 以root用户运行(需要docker权限) + steps: + - name: ✈️ Deploy on Internal Server + uses: ${{env.JCNC_GITEA_URL}}/appleboy/ssh-action@v1 + with: + host: $SINGAPORE_SERVER_HOST + port: $SSH_PROT + username: root + password: ${{ secrets.SINGAPORE_SERVER_PASSWORD }} + script: | + cd /home/deploy/llmx + echo "准备部署环境..." + chmod +x docker-compose.master.yml + echo "当前Docker状态:" + docker ps -a + echo "清理旧容器..." + docker compose -f docker-compose.master.yml down --remove-orphans + echo "清理后Docker状态:" + docker ps -a + echo "拉取最新镜像..." + docker compose -f docker-compose.master.yml pull + echo "启动新服务..." + docker compose -f docker-compose.master.yml up -d + docker compose ps + echo "=== 服务状态检查 ===" + docker compose -f docker-compose.master.yml ps + echo "开始清理无标签镜像..." + docker image prune -f + echo "清理docker-compose.master.yml" + rm -rf docker-compose.master.yml diff --git a/docker/docker-compose.master.agent.yml b/docker/docker-compose.master.agent.yml new file mode 100644 index 0000000..212ec44 --- /dev/null +++ b/docker/docker-compose.master.agent.yml @@ -0,0 +1,32 @@ +services: + llmx-core-service-banana: + image: ${DOCKER_REGISTRY_URL}/llmx-core-service + container_name: llmx-core-service + ports: + - "9002:9002" + networks: + - llmx-net-master + environment: + SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE} + volumes: + - llmx-core-service-volume:/app/volume + restart: always + llmx-impl-bailian-banana: + image: ${DOCKER_REGISTRY_URL}/llmx-impl-bailian + container_name: llmx-impl-bailian + ports: + - "9003:9003" + networks: + - llmx-net-master + environment: + SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE} + volumes: + - llmx-impl-bailian-volume:/app/volume + restart: always + +networks: + llmx-net-master: + driver: bridge +volumes: + llmx-core-service-volume: + llmx-impl-bailian-volume: diff --git a/docker/docker-compose.master.main.yml b/docker/docker-compose.master.main.yml new file mode 100644 index 0000000..0d61505 --- /dev/null +++ b/docker/docker-compose.master.main.yml @@ -0,0 +1,48 @@ +services: + llmx-core-service-apple: + image: ${DOCKER_REGISTRY_URL}/llmx-core-service + container_name: llmx-core-service + ports: + - "9002:9002" + networks: + - llmx-net-master + environment: + SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE} + volumes: + - llmx-core-service-volume:/app/volume + restart: always + llmx-database: + image: postgres:16-alpine # 长期支持版本推荐用 16 + container_name: llmx-database + restart: always + ports: + - "9052:5432" + networks: + - llmx-net-master + environment: + POSTGRES_DB: llmx_db + POSTGRES_USER: llmx + POSTGRES_PASSWORD: L4s6f9y3, + volumes: + - llmx-db-volume + llmx-impl-bailian-apple: + image: ${DOCKER_REGISTRY_URL}/llmx-impl-bailian + container_name: llmx-impl-bailian + ports: + - "9003:9003" + networks: + - llmx-net-master + environment: + SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE} + volumes: + - llmx-impl-bailian-volume:/app/volume + restart: always + +networks: + llmx-net-master: + driver: bridge + +volumes: + llmx-core-service-volume: + llmx-impl-bailian-volume: + llmx-db-volume: diff --git a/llmx-core/llmx-core-service/src/main/resources/application-master.yml b/llmx-core/llmx-core-service/src/main/resources/application-master.yml index e78b1c6..5af7893 100644 --- a/llmx-core/llmx-core-service/src/main/resources/application-master.yml +++ b/llmx-core/llmx-core-service/src/main/resources/application-master.yml @@ -1,7 +1,2 @@ server: - port: 9002 -spring: - cloud: - nacos: - discovery: - server-addr: 49.235.96.75:9001 \ No newline at end of file + port: 9002 \ No newline at end of file diff --git a/llmx-core/llmx-core-service/src/main/resources/bootstrap-master.yml b/llmx-core/llmx-core-service/src/main/resources/bootstrap-master.yml new file mode 100644 index 0000000..473128d --- /dev/null +++ b/llmx-core/llmx-core-service/src/main/resources/bootstrap-master.yml @@ -0,0 +1,23 @@ +spring: + cloud: + nacos: + username: nacos + password: L4s6f9y3, + server-addr: 49.235.96.75:8848 + discovery: + server-addr: ${spring.cloud.nacos.server-addr} + username: ${spring.cloud.nacos.username} + password: ${spring.cloud.nacos.password} + group: llmx-${spring.profiles.active} + namespace: ab34d859-6f1a-4f28-ac6b-27a7410ab27b + config: + file-extension: yaml + namespace: ab34d859-6f1a-4f28-ac6b-27a7410ab27b + refresh-enabled: true + extension-configs: + - data-id: ${spring.application.name}-${spring.profiles.active}.yaml + refresh: true + group: ${spring.application.name} + - data-id: common-db.yaml + refresh: true + group: infra \ No newline at end of file diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/application-master.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/application-master.yml index 292217d..9beecae 100644 --- a/llmx-impl/llmx-impl-bailian/src/main/resources/application-master.yml +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/application-master.yml @@ -1,22 +1,2 @@ server: - port: 9003 -spring: - application: - name: llmx-impl-bailian - cloud: - nacos: - discovery: - server-addr: 49.235.96.75:9001 # Nacos 服务地址 -# 阿里云配置 -aliyun: - # DashScope服务配置 - dash: - # 访问凭证配置 - scope: - access-key-id: LTAI5tHiA2Ry3XTAfoSEJW6z # 阿里云访问密钥ID - access-key-secret: K5sf4FxZZuUgLEFnyfepBfMqFGmDcD # 阿里云访问密钥密钥 - endpoint: bailian.cn-beijing.aliyuncs.com # 阿里云服务端点 - workspace-id: llm-axfkuqft05uzbjpi # 工作区ID - api-key: sk-78af4dd964a94f4cb373851064dbdc12 # API密钥 - app-id: 3fae0bbab2e54a90a37aa02cd12dd62c # 应用ID - base-url: https://dashscope.aliyuncs.com/api/v1/apps/ # 基础API URL + port: 9003 \ No newline at end of file diff --git a/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-master.yml b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-master.yml new file mode 100644 index 0000000..399cdd9 --- /dev/null +++ b/llmx-impl/llmx-impl-bailian/src/main/resources/bootstrap-master.yml @@ -0,0 +1,20 @@ +spring: + cloud: + nacos: + username: nacos + password: L4s6f9y3, + server-addr: 49.235.96.75:8848 + discovery: + username: ${spring.cloud.nacos.username} + password: ${spring.cloud.nacos.password} + server-addr: ${spring.cloud.nacos.server-addr} + group: llmx-${spring.profiles.active} + namespace: ab34d859-6f1a-4f28-ac6b-27a7410ab27b + config: + file-extension: yaml + namespace: ab34d859-6f1a-4f28-ac6b-27a7410ab27b + refresh-enabled: true + extension-configs: + - data-id: ${spring.application.name}-${spring.profiles.active}.yaml + refresh: true + group: ${spring.application.name} \ No newline at end of file -- 2.47.2