1 line
21 KiB
JSON
1 line
21 KiB
JSON
{"repo": "besley/slickflow", "files": {"source/sfdapi/appsettings.json": {"646392d3e9be7e34b79f6fa8ca0f23dd80db2b6e": {"t": 1785674047.5309303, "n": 2121, "h": "38df5d6caa94200b", "c": "{\n \"ConnectionStrings\": {\n \"WfDBConnectionType\": \"PGSQL\",\n \"WfDBConnectionString\": \"Server=127.0.0.1;Port=5432;Database=wfdbtest2099;User Id=postgres;Password=<YOUR_DB_PASSWORD>;TimeZone=UTC;Keepalive=30;TCP Keepalive=true;\"\n //\"WfDBConnectionType\": \"MYSQL\",\n //\"WfDBConnectionString\": \"Server=127.0.0.1;Port=3306;Database=wfdbtest2099;Uid=root;Pwd=<YOUR_DB_PASSWORD>;Convert Zero Datetime=True;\"\n //\"WfDBConnectionType\": \"SQLSERVER\",\n //\"WfDBConnectionString\": \"Data Source=127.0.0.1;Initial Catalog=WfDBBpmn2;Integrated Security=False;User ID=sa;Password=<YOUR_DB_PASSWORD>;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False\"\n //\"WfDBConnectionType\": \"ORACLE\",\n //\"WfDBConnectionString\": \"user id=WfDB;password=<YOUR_DB_PASSWORD>;data source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XE)))\"\n },\n \"Logging\": {\n \"IncludeScopes\": false,\n \"LogLevel\": {\n \"Default\": \"Warning\"\n }\n },\n \"AiModelProvider\": {\n \"MasterKeyDb\": \"<YOUR_MASTER_KEY_BASE64>\",\n \"ActiveProvider\": \"QianWen\",\n \"SupabaseProjectUrl\": \"https://<YOUR_SUPABASE_PROJECT>.supabase.co\",\n \"SupabaseServiceRoleKey\": \"<YOUR_SUPABASE_SERVICE_ROLE_KEY>\",\n \"SfAI\": {\n \"SfAIBaseUrl\": \"http://demo.slickflow.com/sfai/api/aigen2demo\",\n \"SfAIBpmnByAIEndpoint\": \"CreateProcessByAI\"\n },\n \"OpenAI\": {\n \"BaseUrl\": \"https://api.openai.com/v1\",\n \"ApiKey\": \"<YOUR_OPENAI_API_KEY>\",\n \"ApiKeyHeaderName\": \"Authorization\",\n \"ApiKeyPrefix\": \"Bearer\",\n \"Model\": \"gpt-4o\",\n \"ApiUrl\": \"/chat/completions\",\n \"UseDashScopeNativeFormat\": false\n },\n \"QianWen\": {\n \"BaseUrl\": \"https://dashscope.aliyuncs.com/compatible-mode\",\n \"ApiKey\": \"<YOUR_QIANWEN_API_KEY>\",\n \"ApiKeyHeaderName\": \"Authorization\",\n \"ApiKeyPrefix\": \"Bearer\",\n \"Model\": \"qwen-plus\",\n \"Endpoint\": \"/v1/chat/completions\"\n },\n \"DeepSeek\": {\n \"BaseUrl\": \"https://api.deepseek.com\",\n \"ApiKey\": \"<YOUR_DEEPSEEK_API_KEY>\",\n \"Model\": \"deepseek-chat\",\n \"Endpoint\": \"/v1/chat/completions\"\n }\n }\n}\n"}, "0d793d13a1c66a426b2b383cc25f5cdb8269b967": {"t": 1785749446.359544, "n": 1135, "h": "718a2c74b8ded175", "c": "{\n \"ConnectionStrings\": {\n \"WfDBConnectionType\": \"PGSQL\",\n \"WfDBConnectionString\": \"Server=127.0.0.1;Port=5432;Database=wfdbbpmn2;User Id=postgres;Password=123456;TimeZone=UTC;\"\n //\"WfDBConnectionType\": \"MYSQL\",\n //\"WfDBConnectionString\": \"Server=127.0.0.1;Port=3306;Database=wfdbbpmn2;Uid=root;Pwd=123456;Convert Zero Datetime=True;\"\n //\"WfDBConnectionType\": \"SQLSERVER\",\n //\"WfDBConnectionString\": \"Data Source=127.0.0.1;Initial Catalog=WfDBBpmn2;Integrated Security=False;User ID=sa;Password=sqlserver;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False\"\n //\"WfDBConnectionType\": \"ORACLE\",\n //\"WfDBConnectionString\": \"user id=WfDB;password=WfDB;data source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XE)))\"\n },\n \"Logging\": {\n \"IncludeScopes\": false,\n \"LogLevel\": {\n \"Default\": \"Warning\"\n }\n },\n \"AiModelProvider\": {\n \"MasterKeyDb\": \"uF6POUlHNu5f7WAjFtu5VJ3qT8Sx6kM1WS8ltR1WPO8=\",\n \"SfAI\": {\n \"SfAIBaseUrl\": \"http://demo.slickflow.com/sfai/api/aigen2demo\",\n \"SfAIBpmnByAIEndpoint\": \"CreateProcessByAI\"\n }\n }\n}\n"}, "231de80fe36a4bc4e64d0a23eb1721a220e5aea0": {"t": 1785749447.6620402, "n": 964, "h": "9c2a2dc0361fdcad", "c": "{\n \"ConnectionStrings\": {\n \"WfDBConnectionType\": \"SQLSERVER\",\n \"WfDBConnectionString\": \"Data Source=127.0.0.1;Initial Catalog=WfDBBpmn2;Integrated Security=False;User ID=sa;Password=sqlserver;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False\"\n //\"WfDBConnectionType\": \"MYSQL\",\n //\"WfDBConnectionString\": \"Server=127.0.0.1;Port=13306;Database=wfdbcore2021;Uid=root;Pwd=sqlserver;Convert Zero Datetime=True;\"\n //\"WfDBConnectionType\": \"ORACLE\",\n //\"WfDBConnectionString\": \"user id=WfDB;password=WfDB;data source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=114.215.190.71)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XE)))\"\n //\"WfDBConnectionType\": \"PGSQL\",\n //\"WfDBConnectionString\": \"Server=127.0.0.1;Port=15432;Database=wfdbcore2021;User Id=postgres;Password=sqlserver;\"\n },\n \"Logging\": {\n \"IncludeScopes\": false,\n \"LogLevel\": {\n \"Default\": \"Warning\"\n }\n }\n}\n"}, "ac83bc232a675b2b25cc8290eb8d00f6a3638355": {"t": 1785749449.8509524, "n": 964, "h": "9c2a2dc0361fdcad", "c": "{\n \"ConnectionStrings\": {\n \"WfDBConnectionType\": \"SQLSERVER\",\n \"WfDBConnectionString\": \"Data Source=127.0.0.1;Initial Catalog=WfDBBpmn2;Integrated Security=False;User ID=sa;Password=sqlserver;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False\"\n //\"WfDBConnectionType\": \"MYSQL\",\n //\"WfDBConnectionString\": \"Server=127.0.0.1;Port=13306;Database=wfdbcore2021;Uid=root;Pwd=sqlserver;Convert Zero Datetime=True;\"\n //\"WfDBConnectionType\": \"ORACLE\",\n //\"WfDBConnectionString\": \"user id=WfDB;password=WfDB;data source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=114.215.190.71)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XE)))\"\n //\"WfDBConnectionType\": \"PGSQL\",\n //\"WfDBConnectionString\": \"Server=127.0.0.1;Port=15432;Database=wfdbcore2021;User Id=postgres;Password=sqlserver;\"\n },\n \"Logging\": {\n \"IncludeScopes\": false,\n \"LogLevel\": {\n \"Default\": \"Warning\"\n }\n }\n}\n"}, "b814bfc5d539708e816aa81cab7422cf04b82205": {"t": 1785749452.1183834, "n": 964, "h": "9c2a2dc0361fdcad", "c": "{\n \"ConnectionStrings\": {\n \"WfDBConnectionType\": \"SQLSERVER\",\n \"WfDBConnectionString\": \"Data Source=127.0.0.1;Initial Catalog=WfDBBpmn2;Integrated Security=False;User ID=sa;Password=sqlserver;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False\"\n //\"WfDBConnectionType\": \"MYSQL\",\n //\"WfDBConnectionString\": \"Server=127.0.0.1;Port=13306;Database=wfdbcore2021;Uid=root;Pwd=sqlserver;Convert Zero Datetime=True;\"\n //\"WfDBConnectionType\": \"ORACLE\",\n //\"WfDBConnectionString\": \"user id=WfDB;password=WfDB;data source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=114.215.190.71)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XE)))\"\n //\"WfDBConnectionType\": \"PGSQL\",\n //\"WfDBConnectionString\": \"Server=127.0.0.1;Port=15432;Database=wfdbcore2021;User Id=postgres;Password=sqlserver;\"\n },\n \"Logging\": {\n \"IncludeScopes\": false,\n \"LogLevel\": {\n \"Default\": \"Warning\"\n }\n }\n}\n"}}, "source/core/Slickflow.AI/Configuration/AIAppConfigProviderOptions.cs": {"646392d3e9be7e34b79f6fa8ca0f23dd80db2b6e": {"t": 1785746184.2775984, "n": 4049, "h": "4047836503f92790", "c": "using Microsoft.Extensions.Configuration;\n\nnamespace Slickflow.AI.Configuration\n{\n /// <summary>\n /// Simplified AI provider options loader.\n /// </summary>\n public class AiAppConfigProviderOptions\n {\n private const string SectionName = \"AiModelProvider\";\n public string MasterKeyDb { get; set; } = string.Empty;\n public string SupabaseProjectUrl { get; set; } = string.Empty;\n public string SupabaseServiceRoleKey { get; set; } = string.Empty;\n public string AiChatMessageWebHook { get; set; } = string.Empty;\n /// <summary>Active AI provider for BPMN generation: \"OpenAI\" | \"DeepSeek\" | \"QianWen\" (default)</summary>\n public string ActiveProvider { get; set; } = \"QianWen\";\n /// <summary>RAG embedding provider: \"OpenAI\" (default) or \"QWen3\"</summary>\n public string RagEmbeddingProvider { get; set; } = \"OpenAI\";\n /// <summary>RAG 向量查询输出维度,默认 1536</summary>\n public int RagEmbeddingDimensions { get; set; } = 1536;\n public SfAIOptions? SfAI { get; set; }\n public QianWenOptions? QianWen { get; set; }\n public OpenAIOptions? OpenAI { get; set; }\n public DeepSeekOptions? DeepSeek { get; set; }\n\n public static AiAppConfigProviderOptions Load(IConfiguration configuration)\n {\n if (configuration == null) throw new ArgumentNullException(nameof(configuration));\n\n var section = configuration.GetSection(SectionName);\n if (!section.Exists())\n {\n return new AiAppConfigProviderOptions();\n }\n\n var options = new AiAppConfigProviderOptions();\n // Bind all matching properties (MasterKey, AIBpmnAppUrl)\n section.Bind(options);\n return options;\n }\n }\n\n public class SfAIOptions\n {\n public string SfAIBaseUrl { get; set; } = string.Empty;\n public string SfAIBpmnByAIEndpoint { get; set; } = string.Empty;\n }\n\n public class QianWenOptions\n {\n public string BaseUrl { get; set; } = string.Empty;\n public string ApiKey { get; set; } = string.Empty;\n public string ApiKeyHeaderName { get; set; }\n public string ApiKeyPrefix { get; set; }\n public string Model { get; set; } = \"gpt-4o\";\n public string Endpoint { get; set; }\n /// <summary>RAG embedding 模型名,默认 text-embedding-v3(QWen3-Embedding)</summary>\n public string EmbeddingModel { get; set; } = \"text-embedding-v3\";\n\n public string ChatApiUrl\n {\n get\n {\n var baseUri = new Uri(BaseUrl.TrimEnd('/'));\n var endpoint = Endpoint.TrimStart('/');\n var fullPath = $\"{baseUri.AbsoluteUri.TrimEnd('/')}/{endpoint}\";\n return fullPath;\n }\n }\n }\n\n public class OpenAIOptions\n {\n public string ApiKey { get; set; }\n public string BaseUrl { get; set; }\n public string ApiKeyHeaderName { get; set; }\n public string ApiKeyPrefix { get; set; }\n public string Model { get; set; } = \"gpt-4o\";\n public string ApiUrl { get; set; }\n public bool UseDashScopeNativeFormat { get; set; }\n\n public string ChatApiUrl\n {\n get\n {\n var baseUri = new Uri(BaseUrl.TrimEnd('/'));\n var endpoint = ApiUrl.TrimStart('/');\n var fullPath = $\"{baseUri.AbsoluteUri.TrimEnd('/')}/{endpoint}\";\n return fullPath;\n }\n }\n }\n\n /// <summary>\n /// DeepSeek 大模型配置。API 与 OpenAI 完全兼容。\n /// </summary>\n public class DeepSeekOptions\n {\n public string BaseUrl { get; set; } = \"https://api.deepseek.com\";\n public string ApiKey { get; set; } = string.Empty;\n public string Model { get; set; } = \"deepseek-chat\";\n public string Endpoint { get; set; } = \"/v1/chat/completions\";\n\n public string ChatApiUrl =>\n $\"{BaseUrl.TrimEnd('/')}/{Endpoint.TrimStart('/')}\";\n }\n}\n"}, "714be8d504ea1a7aafc9a041096af2ce16777c85": {"t": 1785749446.877058, "n": 3162, "h": "bcac5079adc1b38c", "c": "using Microsoft.Extensions.Configuration;\n\nnamespace Slickflow.AI.Configuration\n{\n /// <summary>\n /// Simplified AI provider options loader.\n /// </summary>\n public class AiAppConfigProviderOptions\n {\n private const string SectionName = \"AiModelProvider\";\n public string MasterKeyDb { get; set; } = string.Empty;\n public string SupabaseProjectUrl { get; set; } = string.Empty;\n public string SupabaseServiceRoleKey { get; set; } = string.Empty;\n public string AiChatMessageWebHook { get; set; } = string.Empty;\n /// <summary>RAG embedding provider: \"OpenAI\" (default) or \"QWen3\"</summary>\n public string RagEmbeddingProvider { get; set; } = \"OpenAI\";\n /// <summary>RAG 向量查询输出维度,默认 1536</summary>\n public int RagEmbeddingDimensions { get; set; } = 1536;\n public SfAIOptions? SfAI { get; set; }\n public QianWenOptions? QianWen { get; set; }\n public OpenAIOptions? OpenAI { get; set; }\n\n public static AiAppConfigProviderOptions Load(IConfiguration configuration)\n {\n if (configuration == null) throw new ArgumentNullException(nameof(configuration));\n\n var section = configuration.GetSection(SectionName);\n if (!section.Exists())\n {\n return new AiAppConfigProviderOptions();\n }\n\n var options = new AiAppConfigProviderOptions();\n // Bind all matching properties (MasterKey, AIBpmnAppUrl)\n section.Bind(options);\n return options;\n }\n }\n\n public class SfAIOptions\n {\n public string SfAIBaseUrl { get; set; } = string.Empty;\n public string SfAIBpmnByAIEndpoint { get; set; } = string.Empty;\n }\n\n public class QianWenOptions\n {\n public string BaseUrl { get; set; } = string.Empty;\n public string ApiKey { get; set; } = string.Empty;\n public string ApiKeyHeaderName { get; set; }\n public string ApiKeyPrefix { get; set; }\n public string Model { get; set; } = \"gpt-4o\";\n public string Endpoint { get; set; }\n\n public string ChatApiUrl\n {\n get\n {\n var baseUri = new Uri(BaseUrl.TrimEnd('/'));\n var endpoint = Endpoint.TrimStart('/');\n var fullPath = $\"{baseUri.AbsoluteUri.TrimEnd('/')}/{endpoint}\";\n return fullPath;\n }\n }\n }\n\n public class OpenAIOptions\n {\n public string ApiKey { get; set; }\n public string BaseUrl { get; set; }\n public string ApiKeyHeaderName { get; set; }\n public string ApiKeyPrefix { get; set; }\n public string Model { get; set; } = \"gpt-4o\";\n public string ApiUrl { get; set; }\n public bool UseDashScopeNativeFormat { get; set; }\n\n public string ChatApiUrl\n {\n get\n {\n var baseUri = new Uri(BaseUrl.TrimEnd('/'));\n var endpoint = ApiUrl.TrimStart('/');\n var fullPath = $\"{baseUri.AbsoluteUri.TrimEnd('/')}/{endpoint}\";\n return fullPath;\n }\n }\n }\n}\n"}, "0d793d13a1c66a426b2b383cc25f5cdb8269b967": {"t": 1785749448.0504465, "n": 2671, "h": "8536f046871a918b", "c": "using Microsoft.Extensions.Configuration;\n\nnamespace Slickflow.AI.Configuration\n{\n /// <summary>\n /// Simplified AI provider options loader.\n /// </summary>\n public class AiAppConfigProviderOptions\n {\n private const string SectionName = \"AiModelProvider\";\n public string MasterKeyDb { get; set; } = string.Empty;\n public SfAIOptions? SfAI { get; set; }\n public QianWenOptions? QianWen { get; set; }\n public OpenAIOptions? OpenAI { get; set; }\n\n public static AiAppConfigProviderOptions Load(IConfiguration configuration)\n {\n if (configuration == null) throw new ArgumentNullException(nameof(configuration));\n\n var section = configuration.GetSection(SectionName);\n if (!section.Exists())\n {\n return new AiAppConfigProviderOptions();\n }\n\n var options = new AiAppConfigProviderOptions();\n // Bind all matching properties (MasterKey, AIBpmnAppUrl)\n section.Bind(options);\n return options;\n }\n }\n\n public class SfAIOptions\n {\n public string SfAIBaseUrl { get; set; } = string.Empty;\n public string SfAIBpmnByAIEndpoint { get; set; } = string.Empty;\n }\n\n public class QianWenOptions\n {\n public string BaseUrl { get; set; } = string.Empty;\n public string ApiKey { get; set; } = string.Empty;\n public string ApiKeyHeaderName { get; set; }\n public string ApiKeyPrefix { get; set; }\n public string Model { get; set; } = \"gpt-4o\";\n public string Endpoint { get; set; }\n\n public string ChatApiUrl\n {\n get\n {\n var baseUri = new Uri(BaseUrl.TrimEnd('/'));\n var endpoint = Endpoint.TrimStart('/');\n var fullPath = $\"{baseUri.AbsoluteUri.TrimEnd('/')}/{endpoint}\";\n return fullPath;\n }\n }\n }\n\n public class OpenAIOptions\n {\n public string ApiKey { get; set; }\n public string BaseUrl { get; set; }\n public string ApiKeyHeaderName { get; set; }\n public string ApiKeyPrefix { get; set; }\n public string Model { get; set; } = \"gpt-4o\";\n public string ApiUrl { get; set; }\n public bool UseDashScopeNativeFormat { get; set; }\n\n public string ChatApiUrl\n {\n get\n {\n var baseUri = new Uri(BaseUrl.TrimEnd('/'));\n var endpoint = ApiUrl.TrimStart('/');\n var fullPath = $\"{baseUri.AbsoluteUri.TrimEnd('/')}/{endpoint}\";\n return fullPath;\n }\n }\n }\n}\n"}}, "source/core/Slickflow.AI/Implementation/DeepSeekLlmService.cs": {"646392d3e9be7e34b79f6fa8ca0f23dd80db2b6e": {"t": 1785746185.0226579, "n": 1255, "h": "f895177299b69070", "c": "using Slickflow.AI.Entity;\nusing Slickflow.WebUtility;\n\nnamespace Slickflow.AI.Implementation\n{\n /// <summary>\n /// DeepSeek LLM 服务。\n /// DeepSeek API 与 OpenAI 完全兼容,直接委托给 OpenAILlmService。\n /// 端点:https://api.deepseek.com/v1/chat/completions\n /// 模型:deepseek-chat / deepseek-reasoner\n /// </summary>\n public class DeepSeekLlmService : IAiLlmService\n {\n private readonly OpenAILlmService _inner = new();\n\n public Task<ResponseResult<AIResponse>> InvokeAIChatServiceAsync(\n string baseUrl,\n string apiKey,\n IList<MultiMediaFile> mediaFileList,\n AiActivityConfigEntity axConfig)\n => _inner.InvokeAIChatServiceAsync(baseUrl, apiKey, mediaFileList, axConfig);\n\n public Task<ResponseResult<AIResponse>> InvokeAIChatServiceWithMessagesAsync(\n string baseUrl,\n string apiKey,\n IList<CustomApiMessage> messages,\n AiActivityConfigEntity axConfig)\n => _inner.InvokeAIChatServiceWithMessagesAsync(baseUrl, apiKey, messages, axConfig);\n\n public Task<string> TestConnectionAsync(string baseUrl, string apiKey, string modelName)\n => _inner.TestConnectionAsync(baseUrl, apiKey, modelName);\n }\n}\n"}, "714be8d504ea1a7aafc9a041096af2ce16777c85": {"t": 1785749446.2195997, "n": 1102, "h": "51a70738e797d842", "c": "using Slickflow.AI.Entity;\nusing Slickflow.WebUtility;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Slickflow.AI.Implementation\n{\n public class DeepSeekLlmService : IAiLlmService\n {\n public Task<ResponseResult<AIResponse>> InvokeAIChatServiceAsync(string baseUrl,\n string apiKey,\n IList<MultiMediaFile> mediaFileList,\n AiActivityConfigEntity axConfig)\n {\n throw new NotImplementedException();\n }\n\n public Task<ResponseResult<AIResponse>> InvokeAIChatServiceWithMessagesAsync(string baseUrl,\n string apiKey,\n IList<CustomApiMessage> messages,\n AiActivityConfigEntity axConfig)\n {\n throw new NotImplementedException(\"Multi-turn RAG with history is currently supported only for OpenAI-compatible provider.\");\n }\n\n public Task<string> TestConnectionAsync(string baseUrl, string apiKey, string modelName)\n {\n throw new NotImplementedException();\n }\n }\n}\n"}, "0d793d13a1c66a426b2b383cc25f5cdb8269b967": {"t": 1785749447.39554, "n": 749, "h": "cc16ddec0fc76d7f", "c": "using Slickflow.WebUtility;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Slickflow.AI.Implementation\n{\n public class DeepSeekLlmService : IAiLlmService\n {\n public Task<ResponseResult<AIResponse>> InvokeAIChatServiceAsync(string baseUrl, string apiKey, string modelName, string systemPrompt, string userMessage,\n IList<MultiMediaFile> mediaFileList, decimal temperature, int maxTokens, int timeout)\n {\n throw new NotImplementedException();\n }\n\n public Task<string> TestConnectionAsync(string baseUrl, string apiKey, string modelName)\n {\n throw new NotImplementedException();\n }\n }\n}\n"}}}} |