Files

1 line
21 KiB
JSON
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"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"}}}}