Skip to content

Commit

Permalink
126: Task 04 - week 3
Browse files Browse the repository at this point in the history
  • Loading branch information
jarmatys committed Dec 24, 2024
1 parent 02ba154 commit 231818d
Show file tree
Hide file tree
Showing 6 changed files with 219 additions and 15 deletions.
9 changes: 9 additions & 0 deletions API/ASSISTENTE.Playground/Data/barbara.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
Podczas pobytu w Krakowie w 2019 roku, Barbara Zawadzka poznała swojego ówczesnego narzeczonego, a obecnie męża, Aleksandra Ragowskiego. Tam też poznali osobę prawdopodobnie powiązaną z ruchem oporu, której dane nie są nam znane. Istnieje podejrzenie, że już wtedy pracowali oni nad planami ograniczenia rozwoju sztucznej inteligencji, tłumacząc to względami bezpieczeństwa. Tajemniczy osobnik zajmował się także organizacją spotkań mających na celu podnoszenie wiedzy na temat wykorzystania sztucznej inteligencji przez programistów. Na spotkania te uczęszczała także Barbara.

W okolicach 2021 roku Ragowski udał się do Warszawy celem spotkania z profesorem Andrzejem Majem. Prawdopodobnie nie zabrał ze sobą żony, a cel ich spotkania nie jest do końca jasny.

Podczas pobytu w Warszawie, w instytucie profesora doszło do incydentu, w wyniku którego, jeden z laborantów - Rafał Bomba - zaginął. Niepotwierdzone źródła informacji podają jednak, że Rafał spędził około 2 lata, wynajmując pokój w pewnym hotelu. Dlaczego zniknął? Przed kim się ukrywał? Z kim kontaktował się przez ten czas i dlaczego ujawnił się po tym czasie? Na te pytania nie znamy odpowiedzi, ale agenci starają się uzupełnić brakujące informacje.

Istnieje podejrzenie, że Rafał mógł być powiązany z ruchem oporu. Prawdopodobnie przekazał on notatki profesora Maja w ręce Ragowskiego, a ten po powrocie do Krakowa mógł przekazać je swojej żonie. Z tego powodu uwaga naszej jednostki skupia się na odnalezieniu Barbary.

Aktualne miejsce pobytu Barbary Zawadzkiej nie jest znane. Przypuszczamy jednak, że nie opuściła ona kraju.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System.Text.Json.Serialization;

namespace ASSISTENTE.Playground.Models.DataApiModels;

public class DataApiRequestModel
{
[JsonPropertyName("apikey")]
public required string ApiKey { get; set; }

[JsonPropertyName("query")]
public required string Query { get; set; }
}
12 changes: 12 additions & 0 deletions API/ASSISTENTE.Playground/Models/DataApiModels/DataApiResponse.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System.Text.Json.Serialization;

namespace ASSISTENTE.Playground.Models.DataApiModels;

public class DataApiResponse
{
[JsonPropertyName("code")]
public required object Code { get; set; }

[JsonPropertyName("message")]
public required string Message { get; set; }
}
2 changes: 1 addition & 1 deletion API/ASSISTENTE.Playground/Playground.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public async Task LearnAsync()

public async Task RunAsync()
{
var result = await weekThree.Task_03()
var result = await weekThree.Task_04()
.Tap(result => logger.LogInformation(result))
.TapError(error => logger.LogError(error));
}
Expand Down
58 changes: 53 additions & 5 deletions API/ASSISTENTE.Playground/Tasks/TaskBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Text.Json;
using ASSISTENTE.Playground.Models;
using ASSISTENTE.Playground.Models.CentralModels;
using ASSISTENTE.Playground.Models.DataApiModels;
using ASSISTENTE.Playground.Models.DatabaseModels;
using CSharpFunctionalExtensions;

Expand Down Expand Up @@ -72,11 +73,11 @@ protected async Task<Result<string>> ReportResult(string taskName, object? taskR

var deserializedContent = JsonSerializer.Deserialize<TaskResponse>(responseContent);

return !response.IsSuccessStatusCode
? Result.Failure<string>(deserializedContent?.Message)
return !response.IsSuccessStatusCode
? Result.Failure<string>(deserializedContent?.Message)
: Result.Success(deserializedContent!.Message);
}

protected async Task<Result<string>> DatabaseQuery(string taskName, string query)
{
const string databaseUrl = "https://centrala.ag3nts.org/apidb";
Expand All @@ -100,8 +101,55 @@ protected async Task<Result<string>> DatabaseQuery(string taskName, string query

var deserializedContent = JsonSerializer.Deserialize<DatabaseResponse>(responseContent);

return !response.IsSuccessStatusCode
? Result.Failure<string>(deserializedContent?.Error)
return !response.IsSuccessStatusCode
? Result.Failure<string>(deserializedContent?.Error)
: Result.Success(deserializedContent!.Reply.ToString())!;
}

protected async Task<Result<string>> DataApiQuery(string source, string query)
{
const string peopleUrl = "https://centrala.ag3nts.org/people";
const string placesUrl = "https://centrala.ag3nts.org/places";

var request = new DataApiRequestModel
{
ApiKey = ApiKey,
Query = query
};

HttpResponseMessage response;

if (source == "PEOPLE")
{
response = await httpClient.PostAsync(
peopleUrl,
new StringContent(
JsonSerializer.Serialize(request),
Encoding.UTF8, "application/json"
)
);
}
else if (source == "PLACES")
{
response = await httpClient.PostAsync(
placesUrl,
new StringContent(
JsonSerializer.Serialize(request),
Encoding.UTF8, "application/json"
)
);
}
else
{
return Result.Failure<string>("Invalid source");
}

var responseContent = await response.Content.ReadAsStringAsync();

var deserializedContent = JsonSerializer.Deserialize<DataApiResponse>(responseContent);

return !response.IsSuccessStatusCode
? Result.Failure<string>(deserializedContent?.Message)
: Result.Success(deserializedContent!.Message);
}
}
141 changes: 132 additions & 9 deletions API/ASSISTENTE.Playground/Tasks/WeekThree.cs
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ public async Task<Result<string>> Task_03()
"którzy są na urlopie (is_active=0)";

const string acceptableFormat = "1, 2, 3";

var context = new StringBuilder();

while (true)
Expand All @@ -212,20 +212,20 @@ public async Task<Result<string>> Task_03()
var verifyPrompt = $"""
Twoim zadaniem jest zweryfikować czy w pozyskanych informacjach znajduje się
odpowiedź na zadane pytanie.
<PYTANIE>
{question}
</PYTANIE>
<KONTEKST>
{masterContext}
</KONTEKST>
Jeżeli nie znajdziesz odpowiedzi, zwróć "BRAK".
Jeżeli znajdziesz odpowiedź, zwróć znalezioną informację.
Zwrócona informacja powinna zawierać tylko i wyłącznie odpowiedź na pytanie
w formacie: {acceptableFormat}
""";
Expand All @@ -239,7 +239,7 @@ Zwrócona informacja powinna zawierać tylko i wyłącznie odpowiedź na pytanie
var inActiveDataCenterIds = hasAnswer.Split(", ")
.Select(int.Parse)
.ToList();

return await ReportResult("database", inActiveDataCenterIds);
}
}
Expand Down Expand Up @@ -292,7 +292,130 @@ Jeżeli nie jesteś pewny jak odpowiedzieć na zadane pytanie przygotuj kolejne

break;
}

return Result.Success("Zadanie zakończone");
}

public async Task<Result<string>> Task_04()
{
const string question = "Twoim zadaniem jest zweryfikowanie wszystkich kombinacji imion i miast na podstawie " +
"dostępnych informacji. Sprawdzaj osoby, dostaniesz informacje o miastach, a nastepnie " +
"sprawdzaj miasta, dostaniesz informacje o osobach.";

const string placesDescription = """
Pierwszy z nich to wyszukiwarka członków ruchu oporu. Możemy wyszukiwać ich z
użyciem imienia podanego w formie mianownika, a w odpowiedzi otrzymamy listę
miejsc, w których ich widziano.
<PRZYKŁAD>
RAFAL
<PRZYKŁAD>
""";

const string peopleDescription = """
Drugi system to wyszukiwarka miejsc odwiedzonych przez konkretne osoby.
Podajesz nazwę miasta do sprawdzenia (bez polskich znaków) i w odpowiedzi
dowiadujesz się, których z członków ruchu oporu tam widziano.
<PRZYKŁAD>
WARSZAWA
<PRZYKŁAD>
""";

var introInformation = await File.ReadAllTextAsync("Data/barbara.txt");

const string restrictedData = "[**RESTRICTED DATA**]";

var placesWithPeople = new Dictionary<string, List<string>>();
var peopleWithPlaces = new Dictionary<string, List<string>>();

var checkedPlaces = new List<string>();
var checkedPeople = new List<string>();

var forbiddenRecords = new List<string>();

return Result.Success("");

string MasterPrompt()
{
return """
Twoim zadaniem jest znalezienie odpowiedzi na pytanie:
<PYTANIE>
{question}
</PYTANIE>
<KONTEKST>
{introInformation}
</KONTEKST>
<ZASADY>
1. Jeżeli w zebranych informacjach nie udało się namierzyć odpowiedzi, wykonaj kolejne zapytanie!
2. Zwracaj tylko i wyłącznie nazwę miasta lub osoby duzymi literami bez polskich znaków!
3. Nie formatuj tekstu i nie zwracaj markdown oraz znaków specjalnych!
4. Nie używaj polskich znaków!
5. NIE UŻYWAJ ZAKAZANYCH WARTOŚCI!
</ZASADY>
<ZAKAZANE WARTOŚCI>
{forbiddenRecords}
</ZAKAZANE WARTOŚCI>
<DOSTĘPNE SYSTEMY - WERYFIKACJA MIEJSC>
{placesDescription}
</DOSTĘPNE SYSTEMY - WERYFIKACJA MIEJSC>
<DOSTĘPNE SYSTEMY - WERYFIKACJA OSÓB>
{peopleDescription}
</DOSTĘPNE SYSTEMY - WERYFIKACJA OSÓB>
<ZEBRANE INFORMACJE>
OSOBY DO SPRAWDZENIA: {string.Join(", ", peopleToCheck)}
MIEJSCA DO SPRAWDZENIA: {string.Join(", ", placesToCheck)}
SPRAWDZIŁEŚ JUŻ:
SPRAWDZONE OSOBY: {string.Join(", ", checkedPeople)}
SPRAWDZONE MIEJSCA: {string.Join(", ", checkedPlaces)}
</ZEBRANE INFORMACJE>
Na podstawie zebranych informacji oraz kontekstu, generuj zapytania do people api i
places api według podanego formatu. Zwróć tylko i wyłącznie to czego wymaga dane zapytanie.
""";
}

string VerifyPrompt(string answer)
{
return $"""
Rozpoznaj czy otrzymana wartość dotyczy osób czy miejsc
<WARTOŚĆ>
{answer}
</WARTOŚĆ>
Otrzymana wartość nie może zawierać polskich znaków, jeżeli wykryjesz polskie znaki
zwróć error.
<PRZYKŁAD>
Otrzymałeś: BARBARA
Zwróć: PEOPLE
</PRZYKŁAD>
<PRZYKŁAD>
Otrzymałeś: WARSZAWA
Zwróć: PLACES
</PRZYKŁAD>
<PRZYKŁAD>
Otrzymałeś: Nie mamy wystarczajacych informacji w zebranych danych, aby okreslic aktualne miejsce pobytu Barbary. Spróbuje uzyskac wiecej informacji.
Zwróć: ERROR
</PRZYKŁAD>
<PRZYKŁAD>
Otrzymałeś: RAFAŁ
Zwróć: ERROR
</PRZYKŁAD>
NIE ZWRACAJ NIC POZA WARTOŚCIĄ: PLACES, PEOPLE, ERROR
""";
}
}
}

0 comments on commit 231818d

Please sign in to comment.