Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .aspire/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"appHostPath": "../src/NoteBookmark.AppHost/NoteBookmark.AppHost.csproj"
}
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -493,3 +493,7 @@ NoteBookmark.BlazorApp/appsettings.Development.json
.azure

NoteBookmark.AppHost/appsettings.Development.json

src/NoteBookmark.AppHost/appsettings.[Dd]evelopment.json

src/NoteBookmark.AppHost/appsettings.json
Empty file.
18 changes: 0 additions & 18 deletions src/NoteBookmark.AIServices/Choice.cs

This file was deleted.

12 changes: 0 additions & 12 deletions src/NoteBookmark.AIServices/ContentItem.cs

This file was deleted.

34 changes: 0 additions & 34 deletions src/NoteBookmark.AIServices/Message.cs

This file was deleted.

6 changes: 6 additions & 0 deletions src/NoteBookmark.AIServices/NoteBookmark.AIServices.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="10.0.0-rc.2.25502.107" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.10" />
<PackageReference Include="Reka.SDK" Version="0.1.0" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="../NoteBookmark.Domain/NoteBookmark.Domain.csproj" />
</ItemGroup>


</Project>
21 changes: 0 additions & 21 deletions src/NoteBookmark.AIServices/ReasoningStep.cs

This file was deleted.

18 changes: 0 additions & 18 deletions src/NoteBookmark.AIServices/RekaChatResponse.cs

This file was deleted.

15 changes: 0 additions & 15 deletions src/NoteBookmark.AIServices/RekaMessage.cs

This file was deleted.

31 changes: 0 additions & 31 deletions src/NoteBookmark.AIServices/RekaResponse.cs

This file was deleted.

15 changes: 0 additions & 15 deletions src/NoteBookmark.AIServices/RekaUsage.cs

This file was deleted.

145 changes: 145 additions & 0 deletions src/NoteBookmark.AIServices/ResearchService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
using System.Text;
using System.Text.Json;
using System.IO;
using System.Linq;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Reka.SDK;
using NoteBookmark.Domain;

namespace NoteBookmark.AIServices;

public class ResearchService(HttpClient client, ILogger<ResearchService> logger, IConfiguration config)
{
private readonly HttpClient _client = client;
private readonly ILogger<ResearchService> _logger = logger;
private const string BASE_URL = "https://api.reka.ai/v1/chat/completions";
private const string MODEL_NAME = "reka-flash-research";
private readonly string _apiKey = config["AppSettings:REKA_API_KEY"] ?? Environment.GetEnvironmentVariable("REKA_API_KEY") ?? throw new InvalidOperationException("REKA_API_KEY environment variable is not set.");

public async Task<PostSuggestions> SearchSuggestionsAsync(string topic, string[]? allowedDomains, string[]? blockedDomains)
{
PostSuggestions suggestions = new PostSuggestions();
string query = $"Provide interesting a list of 3 blog posts, published recently, that talks about the topic: {topic}.";

var webSearch = new Dictionary<string, object>
{
["max_uses"] = 3
};

if (allowedDomains != null && allowedDomains.Length > 0)
{
webSearch["allowed_domains"] = allowedDomains;
}
else if (blockedDomains != null && blockedDomains.Length > 0)
{
webSearch["blocked_domains"] = blockedDomains;
}

var requestPayload = new
{
model = MODEL_NAME,

messages = new[]
{
new
{
role = "user",
content = query
}
},
response_format = GetResponseFormat(),
research = new
{
web_search = webSearch
},
};

var jsonPayload = JsonSerializer.Serialize(requestPayload, new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
});

// await SaveToFile("research_request", jsonPayload);

HttpResponseMessage? response = null;

try
{
using var request = new HttpRequestMessage(HttpMethod.Post, BASE_URL);
request.Headers.Add("Authorization", $"Bearer {_apiKey}");
request.Content = new StringContent(jsonPayload, Encoding.UTF8, "application/json");

response = await _client.SendAsync(request);
var responseContent = await response.Content.ReadAsStringAsync();

await SaveToFile("research_response", responseContent);

var rekaResponse = JsonSerializer.Deserialize<RekaResponse>(responseContent);

if (response.IsSuccessStatusCode)
{
suggestions = JsonSerializer.Deserialize<PostSuggestions>(rekaResponse!.Choices![0].Message!.Content!)!;
}
else
{
throw new Exception($"Request failed with status code: {response.StatusCode}. Response: {responseContent}");
}
}
catch (Exception ex)
{
_logger.LogError($"An error occurred while fetching research suggestions: {ex.Message}");
}

return suggestions;
}


private object GetResponseFormat()
{
return new
{
type = "json_schema",
json_schema = new
{
name = "post_suggestions",
schema = new
{
type = "object",
properties = new
{
suggestions = new
{
type = "array",
items = new
{
type = "object",
properties = new
{
title = new { type = "string" },
author = new { type = "string" },
summary = new { type = "string", maxLength = 100 },
publication_date = new { type = "string", format = "date" },
url = new { type = "string" }
},
required = new[] { "title", "summary", "url" }
}
}
},
required = new[] { "post_suggestions" }
}
}
};
}

private async Task SaveToFile(string prefix, string responseContent)
{
string datetime = DateTime.Now.ToString("yyyy-MM-dd_HH-mm");
string fileName = $"{prefix}_{datetime}.json";
string folderPath = "Data";
Directory.CreateDirectory(folderPath);
string filePath = Path.Combine(folderPath, fileName);
await File.WriteAllTextAsync(filePath, responseContent);
}

}
12 changes: 0 additions & 12 deletions src/NoteBookmark.AIServices/ResponseItem.cs

This file was deleted.

1 change: 1 addition & 0 deletions src/NoteBookmark.AIServices/SummaryService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Linq;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Reka.SDK;

namespace NoteBookmark.AIServices;

Expand Down
15 changes: 0 additions & 15 deletions src/NoteBookmark.AIServices/ToolCall.cs

This file was deleted.

Loading
Loading