-
Notifications
You must be signed in to change notification settings - Fork 0
/
Program.cs
150 lines (127 loc) · 4.61 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
using Newtonsoft.Json;
using System.Text;
public class Searcher
{
private static readonly HttpClient client = new HttpClient();
private readonly string apiKey;
private readonly Maritaca maritaca;
public Searcher(string api_key, Maritaca maritacaInstance)
{
apiKey = api_key;
client.BaseAddress = new Uri("https://api.tavily.com/");
maritaca = maritacaInstance;
}
public async Task<string> search(string query, bool includeImages = false, string searchDepth = "basic")
{
var url = "/search";
var requestBody = new
{
api_key = apiKey,
query = query,
include_images = includeImages,
search_depth = searchDepth
};
var jsonBody = JsonConvert.SerializeObject(requestBody);
var content = new StringContent(jsonBody, Encoding.UTF8, "application/json");
var response = await client.PostAsync(url, content);
var responseContent = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
return JsonConvert.SerializeObject(new { error = response.StatusCode.ToString(), details = responseContent });
}
var result = JsonConvert.DeserializeObject<QueryResponse>(responseContent);
if (result == null || result.results == null || !result.results.Any())
{
return JsonConvert.SerializeObject(new { error = "NoResults", details = "No results found or API returned empty response" });
}
var summarizationPrompt = $"Summarize the following search results for the query '{query}':\n\n{JsonConvert.SerializeObject(result, Formatting.Indented)}";
return await maritaca.getCompletion(summarizationPrompt);
}
}
public class Maritaca
{
private static readonly HttpClient client = new HttpClient();
public static int tokenLimit;
public Maritaca(string apiKey, int limit)
{
var key = apiKey;
tokenLimit = limit;
client.DefaultRequestHeaders.Add("Authorization", $"Bearer {key}");
}
public async Task<string> getCompletion(string userMessage)
{
var url = "https://chat.maritaca.ai/api/chat/completions";
var requestBody = new
{
model = "sabia-3",
messages = new[] {
new {role = "user", content = userMessage}
},
max_tokens = tokenLimit
};
var jsonBody = JsonConvert.SerializeObject(requestBody);
var content = new StringContent(jsonBody, Encoding.UTF8, "application/json");
var response = await client.PostAsync(url, content);
response.EnsureSuccessStatusCode();
var responseContent = await response.Content.ReadAsStringAsync();
var result = JsonConvert.DeserializeObject<Response>(responseContent);
return result?.choices?[0]?.message?.content ?? "error: response incomplete";
}
}
public class Program
{
public static async Task Main(string[] args)
{
string[] keys = File.ReadAllLines("config.txt");
string maritacaKey = keys[0];
string searcherKey = keys[1];
var maritaca = new Maritaca(maritacaKey, 2048);
var searcher = new Searcher(searcherKey, maritaca);
while (true)
{
Console.WriteLine("Send your message (.search to search, .exit to exit): ");
string? prompt = Console.ReadLine();
if (prompt == ".exit" || string.IsNullOrEmpty(prompt)) break;
if (prompt.StartsWith(".search"))
{
string searchQuery = prompt.Substring(7).Trim();
var searchResult = await searcher.search(searchQuery);
Console.WriteLine("Search results summary:");
Console.WriteLine(searchResult);
}
else
{
var response = await maritaca.getCompletion(prompt);
Console.WriteLine(response);
}
}
}
}
public class Response
{
public Choice[]? choices { get; set; }
}
public class Choice
{
public Message? message { get; set; }
}
public class Message
{
public string? content { get; set; }
}
public class QueryResponse
{
public string? query { get; set; }
public List<SearchResult>? results { get; set; }
public string? topic { get; set; }
}
public class SearchResult
{
public string? title { get; set; }
public string? url { get; set; }
public string? content { get; set; }
public double? score { get; set; }
public string? published_date { get; set; }
public string? author { get; set; }
public string? image_url { get; set; }
}