1 line
15 KiB
JSON
1 line
15 KiB
JSON
{"repo": "chtholly-ly/nova", "files": {"backend/src/main/java/com/example/shortvideo/service/DeepSeekAiService.java": {"2e2eeb54c3bb225ff2b6f6ae6697e5f3eb431b68": {"t": 1785745679.301869, "n": 3627, "h": "f4b5736848db4981", "c": "package com.example.shortvideo.service;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.stereotype.Service;\n\nimport java.net.URI;\nimport java.net.http.HttpClient;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\nimport java.time.Duration;\nimport java.util.List;\nimport java.util.Map;\n\n@Service\npublic class DeepSeekAiService {\n\n private final ObjectMapper objectMapper;\n private final HttpClient httpClient;\n private final String apiKey;\n private final String baseUrl;\n private final String model;\n\n public DeepSeekAiService(\n ObjectMapper objectMapper,\n @Value(\"${app.deepseek.api-key:}\") String apiKey,\n @Value(\"${app.deepseek.base-url:https://api.deepseek.com}\") String baseUrl,\n @Value(\"${app.deepseek.model:deepseek-chat}\") String model\n ) {\n this.objectMapper = objectMapper;\n this.apiKey = apiKey;\n this.baseUrl = trimSlash(baseUrl);\n this.model = model;\n this.httpClient = HttpClient.newBuilder()\n .connectTimeout(Duration.ofSeconds(8))\n .build();\n }\n\n public String answer(String question) {\n if (apiKey == null || apiKey.isBlank()) {\n return \"DeepSeek API is not configured. Please set DEEPSEEK_API_KEY and restart the backend.\";\n }\n\n try {\n Map<String, Object> payload = Map.of(\n \"model\", model,\n \"messages\", List.of(\n Map.of(\n \"role\", \"system\",\n \"content\", \"You are a DeepSeek-powered assistant inside the nova short-video recommendation system. Answer concisely and practically, preferably in Chinese.\"\n ),\n Map.of(\"role\", \"user\", \"content\", question)\n ),\n \"temperature\", 0.7\n );\n HttpRequest request = HttpRequest.newBuilder()\n .uri(URI.create(baseUrl + \"/chat/completions\"))\n .timeout(Duration.ofSeconds(30))\n .header(\"Content-Type\", \"application/json\")\n .header(\"Authorization\", \"Bearer \" + apiKey)\n .POST(HttpRequest.BodyPublishers.ofString(objectMapper.writeValueAsString(payload)))\n .build();\n HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());\n if (response.statusCode() < 200 || response.statusCode() >= 300) {\n return \"DeepSeek API call failed: \" + response.statusCode()\n + \". Please check the API key, model name, and base URL.\";\n }\n JsonNode root = objectMapper.readTree(response.body());\n String content = root.path(\"choices\").path(0).path(\"message\").path(\"content\").asText(\"\");\n if (content.isBlank()) {\n content = root.path(\"output\").path(\"text\").asText(\"\");\n }\n return content.isBlank() ? \"DeepSeek returned an empty response.\" : content;\n } catch (Exception exception) {\n return \"DeepSeek API call error: \" + exception.getMessage();\n }\n }\n\n private String trimSlash(String value) {\n if (value == null || value.isBlank()) {\n return \"https://api.deepseek.com\";\n }\n return value.endsWith(\"/\") ? value.substring(0, value.length() - 1) : value;\n }\n}\n"}, "7324b9b9e4ae6f48f0aa63e8846e99f35234f71d": {"t": 1785755684.4406068, "n": 3627, "h": "f4b5736848db4981", "c": "package com.example.shortvideo.service;\n\nimport com.fasterxml.jackson.databind.JsonNode;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.stereotype.Service;\n\nimport java.net.URI;\nimport java.net.http.HttpClient;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\nimport java.time.Duration;\nimport java.util.List;\nimport java.util.Map;\n\n@Service\npublic class DeepSeekAiService {\n\n private final ObjectMapper objectMapper;\n private final HttpClient httpClient;\n private final String apiKey;\n private final String baseUrl;\n private final String model;\n\n public DeepSeekAiService(\n ObjectMapper objectMapper,\n @Value(\"${app.deepseek.api-key:}\") String apiKey,\n @Value(\"${app.deepseek.base-url:https://api.deepseek.com}\") String baseUrl,\n @Value(\"${app.deepseek.model:deepseek-chat}\") String model\n ) {\n this.objectMapper = objectMapper;\n this.apiKey = apiKey;\n this.baseUrl = trimSlash(baseUrl);\n this.model = model;\n this.httpClient = HttpClient.newBuilder()\n .connectTimeout(Duration.ofSeconds(8))\n .build();\n }\n\n public String answer(String question) {\n if (apiKey == null || apiKey.isBlank()) {\n return \"DeepSeek API is not configured. Please set DEEPSEEK_API_KEY and restart the backend.\";\n }\n\n try {\n Map<String, Object> payload = Map.of(\n \"model\", model,\n \"messages\", List.of(\n Map.of(\n \"role\", \"system\",\n \"content\", \"You are a DeepSeek-powered assistant inside the nova short-video recommendation system. Answer concisely and practically, preferably in Chinese.\"\n ),\n Map.of(\"role\", \"user\", \"content\", question)\n ),\n \"temperature\", 0.7\n );\n HttpRequest request = HttpRequest.newBuilder()\n .uri(URI.create(baseUrl + \"/chat/completions\"))\n .timeout(Duration.ofSeconds(30))\n .header(\"Content-Type\", \"application/json\")\n .header(\"Authorization\", \"Bearer \" + apiKey)\n .POST(HttpRequest.BodyPublishers.ofString(objectMapper.writeValueAsString(payload)))\n .build();\n HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());\n if (response.statusCode() < 200 || response.statusCode() >= 300) {\n return \"DeepSeek API call failed: \" + response.statusCode()\n + \". Please check the API key, model name, and base URL.\";\n }\n JsonNode root = objectMapper.readTree(response.body());\n String content = root.path(\"choices\").path(0).path(\"message\").path(\"content\").asText(\"\");\n if (content.isBlank()) {\n content = root.path(\"output\").path(\"text\").asText(\"\");\n }\n return content.isBlank() ? \"DeepSeek returned an empty response.\" : content;\n } catch (Exception exception) {\n return \"DeepSeek API call error: \" + exception.getMessage();\n }\n }\n\n private String trimSlash(String value) {\n if (value == null || value.isBlank()) {\n return \"https://api.deepseek.com\";\n }\n return value.endsWith(\"/\") ? value.substring(0, value.length() - 1) : value;\n }\n}\n"}}, "backend/src/main/resources/application.yml": {"2e2eeb54c3bb225ff2b6f6ae6697e5f3eb431b68": {"t": 1785746345.8862786, "n": 2513, "h": "eaa82c0ef554142a", "c": "server:\n port: 8080\n\nspring:\n application:\n name: short-video-platform\n datasource:\n url: ${DB_URL:jdbc:mysql://127.0.0.1:3306/flink-video?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=false}\n username: ${DB_USERNAME:root}\n password: ${DB_PASSWORD:Kishi...015}\n driver-class-name: com.mysql.cj.jdbc.Driver\n mail:\n host: ${MAIL_HOST:smtp.qq.com}\n port: ${MAIL_PORT:587}\n protocol: ${MAIL_PROTOCOL:smtp}\n username: ${MAIL_USERNAME:2191684957@qq.com}\n password: ${MAIL_PASSWORD:fwrurfnydweldiag}\n properties:\n mail:\n smtp:\n auth: true\n starttls:\n enable: true\n required: true\n ssl:\n enable: false\n data:\n redis:\n host: ${REDIS_HOST:localhost}\n port: ${REDIS_PORT:6379}\n database: ${REDIS_DATABASE:0}\n password: ${REDIS_PASSWORD:}\n servlet:\n multipart:\n max-file-size: 500MB\n max-request-size: 520MB\n\nmanagement:\n endpoints:\n web:\n exposure:\n include: health,info\n\napp:\n minio:\n endpoint: http://127.0.0.1:9000\n public-endpoint: http://127.0.0.1:9000\n access-key: minioadmin\n secret-key: minioadmin\n bucket: short-video-media\n use-presigned-url: true\n seed-media-path: ${MEDIA_SEED_PATH:../视频}\n deepseek:\n api-key: ${DEEPSEEK_API_KEY:sk-52b87a7083c14cc3896d8850204d6264}\n base-url: ${DEEPSEEK_BASE_URL:https://api.deepseek.com}\n model: ${DEEPSEEK_MODEL:deepseek-chat}\n elasticsearch:\n enabled: ${ES_ENABLED:true}\n endpoint: ${ES_ENDPOINT:http://127.0.0.1:9200}\n index: ${ES_INDEX:nova_videos}\n username: ${ES_USERNAME:}\n password: ${ES_PASSWORD:}\n recommendation:\n model-service:\n enabled: ${MODEL_SERVICE_ENABLED:true}\n base-url: ${MODEL_SERVICE_BASE_URL:http://127.0.0.1:18080}\n timeout-ms: ${MODEL_SERVICE_TIMEOUT_MS:1500}\n kafka:\n bootstrap-servers: ${KAFKA_BOOTSTRAP_SERVERS:192.168.88.161:9092}\n behavior:\n enabled: ${KAFKA_BEHAVIOR_ENABLED:true}\n topic: ${KAFKA_BEHAVIOR_TOPIC:nova_behavior_logs}\n acks: ${KAFKA_BEHAVIOR_ACKS:1}\n linger-ms: ${KAFKA_BEHAVIOR_LINGER_MS:0}\n retries: ${KAFKA_BEHAVIOR_RETRIES:3}\n user-tags:\n enabled: ${KAFKA_USER_TAGS_ENABLED:true}\n topic: ${KAFKA_USER_TAGS_TOPIC:nova_user_tag_events}\n acks: ${KAFKA_USER_TAGS_ACKS:1}\n linger-ms: ${KAFKA_USER_TAGS_LINGER_MS:0}\n retries: ${KAFKA_USER_TAGS_RETRIES:3}\n"}, "fc937c88e82d6a7bb6e7cfcf5cb62cd2c601313d": {"t": 1785755684.31607, "n": 2513, "h": "eaa82c0ef554142a", "c": "server:\n port: 8080\n\nspring:\n application:\n name: short-video-platform\n datasource:\n url: ${DB_URL:jdbc:mysql://127.0.0.1:3306/flink-video?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=false}\n username: ${DB_USERNAME:root}\n password: ${DB_PASSWORD:Kishi...015}\n driver-class-name: com.mysql.cj.jdbc.Driver\n mail:\n host: ${MAIL_HOST:smtp.qq.com}\n port: ${MAIL_PORT:587}\n protocol: ${MAIL_PROTOCOL:smtp}\n username: ${MAIL_USERNAME:2191684957@qq.com}\n password: ${MAIL_PASSWORD:fwrurfnydweldiag}\n properties:\n mail:\n smtp:\n auth: true\n starttls:\n enable: true\n required: true\n ssl:\n enable: false\n data:\n redis:\n host: ${REDIS_HOST:localhost}\n port: ${REDIS_PORT:6379}\n database: ${REDIS_DATABASE:0}\n password: ${REDIS_PASSWORD:}\n servlet:\n multipart:\n max-file-size: 500MB\n max-request-size: 520MB\n\nmanagement:\n endpoints:\n web:\n exposure:\n include: health,info\n\napp:\n minio:\n endpoint: http://127.0.0.1:9000\n public-endpoint: http://127.0.0.1:9000\n access-key: minioadmin\n secret-key: minioadmin\n bucket: short-video-media\n use-presigned-url: true\n seed-media-path: ${MEDIA_SEED_PATH:../视频}\n deepseek:\n api-key: ${DEEPSEEK_API_KEY:sk-52b87a7083c14cc3896d8850204d6264}\n base-url: ${DEEPSEEK_BASE_URL:https://api.deepseek.com}\n model: ${DEEPSEEK_MODEL:deepseek-chat}\n elasticsearch:\n enabled: ${ES_ENABLED:true}\n endpoint: ${ES_ENDPOINT:http://127.0.0.1:9200}\n index: ${ES_INDEX:nova_videos}\n username: ${ES_USERNAME:}\n password: ${ES_PASSWORD:}\n recommendation:\n model-service:\n enabled: ${MODEL_SERVICE_ENABLED:true}\n base-url: ${MODEL_SERVICE_BASE_URL:http://127.0.0.1:18080}\n timeout-ms: ${MODEL_SERVICE_TIMEOUT_MS:1500}\n kafka:\n bootstrap-servers: ${KAFKA_BOOTSTRAP_SERVERS:192.168.88.161:9092}\n behavior:\n enabled: ${KAFKA_BEHAVIOR_ENABLED:true}\n topic: ${KAFKA_BEHAVIOR_TOPIC:nova_behavior_logs}\n acks: ${KAFKA_BEHAVIOR_ACKS:1}\n linger-ms: ${KAFKA_BEHAVIOR_LINGER_MS:0}\n retries: ${KAFKA_BEHAVIOR_RETRIES:3}\n user-tags:\n enabled: ${KAFKA_USER_TAGS_ENABLED:true}\n topic: ${KAFKA_USER_TAGS_TOPIC:nova_user_tag_events}\n acks: ${KAFKA_USER_TAGS_ACKS:1}\n linger-ms: ${KAFKA_USER_TAGS_LINGER_MS:0}\n retries: ${KAFKA_USER_TAGS_RETRIES:3}\n"}, "7324b9b9e4ae6f48f0aa63e8846e99f35234f71d": {"t": 1785755685.7741535, "n": 1940, "h": "5746001b3df68412", "c": "server:\n port: 8080\n\nspring:\n application:\n name: short-video-platform\n datasource:\n url: ${DB_URL:jdbc:mysql://127.0.0.1:3306/flink-video?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=false}\n username: ${DB_USERNAME:root}\n password: ${DB_PASSWORD:Kishi...015}\n driver-class-name: com.mysql.cj.jdbc.Driver\n mail:\n host: ${MAIL_HOST:smtp.qq.com}\n port: ${MAIL_PORT:587}\n protocol: ${MAIL_PROTOCOL:smtp}\n username: ${MAIL_USERNAME:2191684957@qq.com}\n password: ${MAIL_PASSWORD:fwrurfnydweldiag}\n properties:\n mail:\n smtp:\n auth: true\n starttls:\n enable: true\n required: true\n ssl:\n enable: false\n data:\n redis:\n host: ${REDIS_HOST:localhost}\n port: ${REDIS_PORT:6379}\n database: ${REDIS_DATABASE:0}\n password: ${REDIS_PASSWORD:}\n servlet:\n multipart:\n max-file-size: 500MB\n max-request-size: 520MB\n\nmanagement:\n endpoints:\n web:\n exposure:\n include: health,info\n\napp:\n minio:\n endpoint: http://127.0.0.1:9000\n public-endpoint: http://127.0.0.1:9000\n access-key: minioadmin\n secret-key: minioadmin\n bucket: short-video-media\n use-presigned-url: true\n seed-media-path: ${MEDIA_SEED_PATH:../视频}\n deepseek:\n api-key: ${DEEPSEEK_API_KEY:sk-52b87a7083c14cc3896d8850204d6264}\n base-url: ${DEEPSEEK_BASE_URL:https://api.deepseek.com}\n model: ${DEEPSEEK_MODEL:deepseek-chat}\n elasticsearch:\n enabled: ${ES_ENABLED:true}\n endpoint: ${ES_ENDPOINT:http://127.0.0.1:9200}\n index: ${ES_INDEX:nova_videos}\n username: ${ES_USERNAME:}\n password: ${ES_PASSWORD:}\n recommendation:\n model-service:\n enabled: ${MODEL_SERVICE_ENABLED:true}\n base-url: ${MODEL_SERVICE_BASE_URL:http://127.0.0.1:18080}\n timeout-ms: ${MODEL_SERVICE_TIMEOUT_MS:1500}\n"}}}} |