diff --git a/DysonNetwork.Insight/Thought/ThoughtProvider.cs b/DysonNetwork.Insight/Thought/ThoughtProvider.cs index ef7f502..98a6c03 100644 --- a/DysonNetwork.Insight/Thought/ThoughtProvider.cs +++ b/DysonNetwork.Insight/Thought/ThoughtProvider.cs @@ -47,12 +47,11 @@ public class ThoughtProvider builder.AddOllamaChatCompletion(ModelDefault!, new Uri(endpoint ?? "http://localhost:11434/api")); break; case "deepseek": - builder.AddOpenAIChatCompletion(ModelDefault!, - new OpenAIClient( - new ApiKeyCredential(apiKey!), - new OpenAIClientOptions { Endpoint = new Uri(endpoint ?? "https://api.deepseek.com/v1") } - ) + var client = new OpenAIClient( + new ApiKeyCredential(apiKey!), + new OpenAIClientOptions { Endpoint = new Uri(endpoint ?? "https://api.deepseek.com/v1") } ); + builder.AddOpenAIChatCompletion(ModelDefault!, client); break; default: throw new IndexOutOfRangeException("Unknown thinking provider: " + ModelProviderType); @@ -70,7 +69,7 @@ public class ThoughtProvider var request = new GetAccountRequest { Id = userId }; var response = await _accountClient.GetAccountAsync(request); return JsonSerializer.Serialize(response, GrpcTypeHelper.SerializerOptions); - }, "get_user_profile", "Get a user profile from the Solar Network."), + }, "get_user", "Get a user profile from the Solar Network."), KernelFunctionFactory.CreateFromMethod(async (string postId) => { var request = new GetPostRequest { Id = postId }; @@ -83,36 +82,86 @@ public class ThoughtProvider var response = await _postClient.SearchPostsAsync(request); return JsonSerializer.Serialize(response.Posts, GrpcTypeHelper.SerializerOptions); }, "search_posts", "Search posts by query from the Solar Network."), - KernelFunctionFactory.CreateFromMethod(async () => + KernelFunctionFactory.CreateFromMethod(async ( + string? publisherId = null, + string? realmId = null, + int pageSize = 10, + string? pageToken = null, + string? orderBy = null, + List? categories = null, + List? tags = null, + string? query = null, + List? types = null, + string? afterIso = null, + string? beforeIso = null, + bool includeReplies = false, + int? pinned = null, + bool onlyMedia = false, + bool shuffle = false + ) => { - var request = new ListPostsRequest { PageSize = 10 }; + var request = new ListPostsRequest + { + PublisherId = publisherId, + RealmId = realmId, + PageSize = pageSize, + PageToken = pageToken, + OrderBy = orderBy, + Query = query, + IncludeReplies = includeReplies, + Pinned = pinned.HasValue ? (PostPinMode)pinned : default, + OnlyMedia = onlyMedia, + Shuffle = shuffle + }; + if (!string.IsNullOrEmpty(afterIso)) + { + request.After = + Google.Protobuf.WellKnownTypes.Timestamp.FromDateTimeOffset(DateTimeOffset.Parse(afterIso) + .ToUniversalTime()); + } + + if (!string.IsNullOrEmpty(beforeIso)) + { + request.Before = + Google.Protobuf.WellKnownTypes.Timestamp.FromDateTimeOffset(DateTimeOffset.Parse(beforeIso) + .ToUniversalTime()); + } + + if (categories != null) request.Categories.AddRange(categories); + if (tags != null) request.Tags.AddRange(tags); + if (types != null) request.Types_.AddRange(types.Select(t => (PostType)t)); var response = await _postClient.ListPostsAsync(request); return JsonSerializer.Serialize(response.Posts, GrpcTypeHelper.SerializerOptions); - }, "get_recent_posts", "Get recent posts from the Solar Network.") + }, "list_posts", "Get posts from the Solar Network with customizable filters.") ]); } public PromptExecutionSettings CreatePromptExecutionSettings() { - return ModelProviderType switch + switch (ModelProviderType) { - "ollama" => new OllamaPromptExecutionSettings - { - FunctionChoiceBehavior = FunctionChoiceBehavior.Auto( - options: new FunctionChoiceBehaviorOptions - { - AllowParallelCalls = true, AllowConcurrentInvocation = true - }) - }, - "deepseek" => new OpenAIPromptExecutionSettings - { - FunctionChoiceBehavior = FunctionChoiceBehavior.Auto( - options: new FunctionChoiceBehaviorOptions - { - AllowParallelCalls = true, AllowConcurrentInvocation = true - }) - }, - _ => throw new InvalidOperationException("Unknown provider: " + ModelProviderType) - }; + case "ollama": + return new OllamaPromptExecutionSettings + { + FunctionChoiceBehavior = FunctionChoiceBehavior.Auto( + options: new FunctionChoiceBehaviorOptions + { + AllowParallelCalls = true, + AllowConcurrentInvocation = true + }) + }; + case "deepseek": + return new OpenAIPromptExecutionSettings + { + FunctionChoiceBehavior = FunctionChoiceBehavior.Auto( + options: new FunctionChoiceBehaviorOptions + { + AllowParallelCalls = true, + AllowConcurrentInvocation = true + }) + }; + default: + throw new InvalidOperationException("Unknown provider: " + ModelProviderType); + } } } \ No newline at end of file diff --git a/DysonNetwork.Sphere/Post/PostServiceGrpc.cs b/DysonNetwork.Sphere/Post/PostServiceGrpc.cs index 41bbfbd..fd75daf 100644 --- a/DysonNetwork.Sphere/Post/PostServiceGrpc.cs +++ b/DysonNetwork.Sphere/Post/PostServiceGrpc.cs @@ -69,7 +69,6 @@ public class PostServiceGrpc(AppDatabase db, PostService ps) : Shared.Proto.Post .Include(p => p.ForwardedPost) .Include(p => p.Awards) .Include(p => p.FeaturedRecords) - .Where(p => p.DeletedAt == null) // Only active posts .AsQueryable(); if (!string.IsNullOrWhiteSpace(request.Query)) @@ -82,14 +81,10 @@ public class PostServiceGrpc(AppDatabase db, PostService ps) : Shared.Proto.Post } if (!string.IsNullOrWhiteSpace(request.PublisherId) && Guid.TryParse(request.PublisherId, out var pid)) - { query = query.Where(p => p.PublisherId == pid); - } if (!string.IsNullOrWhiteSpace(request.RealmId) && Guid.TryParse(request.RealmId, out var rid)) - { query = query.Where(p => p.RealmId == rid); - } query = query.FilterWithVisibility(null, [], []); @@ -128,7 +123,6 @@ public class PostServiceGrpc(AppDatabase db, PostService ps) : Shared.Proto.Post .Include(p => p.ForwardedPost) .Include(p => p.Awards) .Include(p => p.FeaturedRecords) - .Where(p => p.DeletedAt == null) .AsQueryable(); query = request.Shuffle @@ -154,9 +148,7 @@ public class PostServiceGrpc(AppDatabase db, PostService ps) : Shared.Proto.Post } if (request.OnlyMedia) - { query = query.Where(e => e.Attachments.Count > 0); - } query = request.Pinned switch { @@ -166,7 +158,7 @@ public class PostServiceGrpc(AppDatabase db, PostService ps) : Shared.Proto.Post Shared.Proto.PostPinMode.PublisherPage when !string.IsNullOrWhiteSpace(request.PublisherId) => query.Where(p => p.PinMode == Shared.Models.PostPinMode.PublisherPage), Shared.Proto.PostPinMode.ReplyPage => query.Where(p => p.PinMode == Shared.Models.PostPinMode.ReplyPage), - _ => query.Where(p => p.PinMode == (Shared.Models.PostPinMode)request.Pinned) + _ => query }; // Include/exclude replies