From 03f97dae61775b15e39aea9794066d436260d800 Mon Sep 17 00:00:00 2001 From: use-the-fork Date: Tue, 22 Oct 2024 18:50:08 -0400 Subject: [PATCH 1/7] =?UTF-8?q?refactor(tools)!:=20reorganize=20tool=20str?= =?UTF-8?q?ucture=20and=20enhance=20ReturnType=20handling=20=F0=9F=9B=A0?= =?UTF-8?q?=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Introduced `ReturnType` enum for flexible return types in tools. - Renamed tool files to better reflect their purposes. - Implemented `SearchTool` interface across relevant tools. - Enhanced error handling in `SerperTool` and related tools. - Updated tests and namespaces for consistency. - Improved code readability and maintainability. --- src/Contracts/Tool/SearchTool.php | 17 +++ src/Enums/ReturnType.php | 19 ++++ .../{ => Search}/SerpAPIGoogleNewsTool.php | 17 ++- .../{ => Search}/SerpAPIGoogleSearchTool.php | 18 ++- src/Tools/{ => Search}/SerperTool.php | 30 +++-- src/Traits/Agent/ManagesTools.php | 7 +- tests/Integrations/ClaudeIntegrationTest.php | 34 +++--- tests/Integrations/OllamaIntegrationTest.php | 2 +- tests/Integrations/OpenAiIntegrationTest.php | 32 +++--- .../Memory/ConversationSummaryMemoryTest.php | 34 +++--- tests/Tools/SerpAPIGoogleNewsToolTest.php | 40 +++---- tests/Tools/SerpAPIGoogleSearchToolTest.php | 38 +++---- tests/Tools/SerperToolTest.php | 34 +++--- tests/Traits/HandlesAgentEventsTest.php | 104 +++++++++--------- tests/Traits/LogsAgentActivityTest.php | 68 ++++++------ tests/Traits/ManagesHooksTest.php | 78 ++++++------- 16 files changed, 319 insertions(+), 253 deletions(-) create mode 100644 src/Contracts/Tool/SearchTool.php create mode 100644 src/Enums/ReturnType.php rename src/Tools/{ => Search}/SerpAPIGoogleNewsTool.php (82%) rename src/Tools/{ => Search}/SerpAPIGoogleSearchTool.php (84%) rename src/Tools/{ => Search}/SerperTool.php (65%) diff --git a/src/Contracts/Tool/SearchTool.php b/src/Contracts/Tool/SearchTool.php new file mode 100644 index 0000000..5a1a520 --- /dev/null +++ b/src/Contracts/Tool/SearchTool.php @@ -0,0 +1,17 @@ +apiKey); $serpApiSearchRequest = new SerpApiSearchRequest($query, 0, 'google_news'); $results = $serpApiConnector->send($serpApiSearchRequest)->array(); - return $this->parseResults($results); + return match ($returnType) { + ReturnType::STRING => $this->parseResults($results), + default => $results + }; } private function parseResults(array $results): string diff --git a/src/Tools/SerpAPIGoogleSearchTool.php b/src/Tools/Search/SerpAPIGoogleSearchTool.php similarity index 84% rename from src/Tools/SerpAPIGoogleSearchTool.php rename to src/Tools/Search/SerpAPIGoogleSearchTool.php index 2080ed6..86d5e6f 100644 --- a/src/Tools/SerpAPIGoogleSearchTool.php +++ b/src/Tools/Search/SerpAPIGoogleSearchTool.php @@ -2,16 +2,19 @@ declare(strict_types=1); -namespace UseTheFork\Synapse\Tools; +namespace UseTheFork\Synapse\Tools\Search; use Illuminate\Support\Arr; use Illuminate\Support\Str; use UseTheFork\Synapse\Contracts\Tool; +use UseTheFork\Synapse\Contracts\Tool\SearchTool; +use UseTheFork\Synapse\Enums\ReturnType; use UseTheFork\Synapse\Exceptions\MissingApiKeyException; use UseTheFork\Synapse\Services\SerpApi\Requests\SerpApiSearchRequest; use UseTheFork\Synapse\Services\SerpApi\SerpApiConnector; +use UseTheFork\Synapse\Tools\BaseTool; -final class SerpAPIGoogleSearchTool extends BaseTool implements Tool +final class SerpAPIGoogleSearchTool extends BaseTool implements Tool, SearchTool { private string $apiKey; @@ -32,15 +35,20 @@ public function __construct() */ public function handle( string $query, - int $numberOfResults = 10, - ): string { + ?string $searchType = 'search', + ?int $numberOfResults = 10, + ReturnType $returnType = ReturnType::STRING, + ): string|array { $serpApiConnector = new SerpApiConnector($this->apiKey); $serpApiSearchRequest = new SerpApiSearchRequest($query, $numberOfResults); $results = $serpApiConnector->send($serpApiSearchRequest)->array(); - return $this->parseResults($results); + return match ($returnType) { + ReturnType::STRING => $this->parseResults($results), + default => $results + }; } private function parseResults(array $results): string diff --git a/src/Tools/SerperTool.php b/src/Tools/Search/SerperTool.php similarity index 65% rename from src/Tools/SerperTool.php rename to src/Tools/Search/SerperTool.php index b9efc65..8c0999d 100644 --- a/src/Tools/SerperTool.php +++ b/src/Tools/Search/SerperTool.php @@ -2,14 +2,19 @@ declare(strict_types=1); -namespace UseTheFork\Synapse\Tools; +namespace UseTheFork\Synapse\Tools\Search; use Illuminate\Support\Arr; +use Saloon\Exceptions\Request\FatalRequestException; +use Saloon\Exceptions\Request\RequestException; +use UseTheFork\Synapse\Contracts\Tool\SearchTool; +use UseTheFork\Synapse\Enums\ReturnType; use UseTheFork\Synapse\Exceptions\MissingApiKeyException; use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; use UseTheFork\Synapse\Services\Serper\SerperConnector; +use UseTheFork\Synapse\Tools\BaseTool; -final class SerperTool extends BaseTool +final class SerperTool extends BaseTool implements SearchTool { private string $apiKey; @@ -25,22 +30,29 @@ public function __construct() /** * Search Google using a query. * - * @param string $query the search query to execute. - * @param string $searchType the type of search must be one of `search`, `places`, `news`. (usually search). - * @param int $numberOfResults the number of results to return must be one of `10`, `20`, `30`, `40`, `50` (usually `10`). + * @param string $query the search query to execute. + * @param string $searchType the type of search must be one of `search`, `places`, `news`. (usually search). + * @param int $numberOfResults the number of results to return must be one of `10`, `20`, `30`, `40`, `50` (usually `10`). * + * @return string + * @throws FatalRequestException + * @throws RequestException */ public function handle( string $query, - string $searchType = 'search', - int $numberOfResults = 10, - ): string { + ?string $searchType = 'search', + ?int $numberOfResults = 10, + ReturnType $returnType = ReturnType::STRING, + ): string|array { $serperConnector = new SerperConnector($this->apiKey); $serperSearchRequest = new SerperSearchRequest($query, $searchType, $numberOfResults); $results = $serperConnector->send($serperSearchRequest)->array(); - return $this->parseResults($results); + return match ($returnType) { + ReturnType::STRING => $this->parseResults($results), + default => $results + }; } private function parseResults(array $results): string diff --git a/src/Traits/Agent/ManagesTools.php b/src/Traits/Agent/ManagesTools.php index 14148d8..6b9a28f 100644 --- a/src/Traits/Agent/ManagesTools.php +++ b/src/Traits/Agent/ManagesTools.php @@ -222,6 +222,7 @@ public function call(PendingAgentTask $pendingAgentTask, string $toolName, ?arra if ( ($parameter_type = $reflectionParameter->getType()) !== null && ! $parameter_type->isBuiltin() && + ! $reflectionParameter->isOptional() && enum_exists($parameter_type->getName()) ) { $params[$reflectionParameter->name] = $parameter_type->getName()::tryFrom($arguments[$reflectionParameter->name]) ?? $reflectionParameter->getDefaultValue(); @@ -239,14 +240,14 @@ enum_exists($parameter_type->getName()) return $tool->handle(...$params); } - private function sanitizeToolParam($value, $type): float|bool|int|string + private function sanitizeToolParam($value, $type): mixed { return match ($type) { 'int' => (int) $value, - 'float' => (float) $value, - 'double' => (float) $value, + 'float', 'double' => (float) $value, 'bool' => (bool) $value, 'string' => (string) $value, + default => $value, }; } } diff --git a/tests/Integrations/ClaudeIntegrationTest.php b/tests/Integrations/ClaudeIntegrationTest.php index 2e8909c..b3b33fa 100644 --- a/tests/Integrations/ClaudeIntegrationTest.php +++ b/tests/Integrations/ClaudeIntegrationTest.php @@ -2,23 +2,23 @@ declare(strict_types=1); - use Saloon\Http\Faking\Fixture; - use Saloon\Http\Faking\MockClient; - use Saloon\Http\Faking\MockResponse; - use Saloon\Http\PendingRequest; - use UseTheFork\Synapse\Agent; - use UseTheFork\Synapse\Contracts\Agent\HasIntegration; - use UseTheFork\Synapse\Contracts\Integration; - use UseTheFork\Synapse\Contracts\Memory; - use UseTheFork\Synapse\Integrations\ClaudeIntegration; - use UseTheFork\Synapse\Integrations\Connectors\Claude\Requests\ChatRequest; - use UseTheFork\Synapse\Memory\CollectionMemory; - use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; - use UseTheFork\Synapse\Tools\SerperTool; - use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; - use UseTheFork\Synapse\ValueObject\SchemaRule; - - test('Connects', function (): void { + use Saloon\Http\Faking\Fixture; + use Saloon\Http\Faking\MockClient; + use Saloon\Http\Faking\MockResponse; + use Saloon\Http\PendingRequest; + use UseTheFork\Synapse\Agent; + use UseTheFork\Synapse\Contracts\Agent\HasIntegration; + use UseTheFork\Synapse\Contracts\Integration; + use UseTheFork\Synapse\Contracts\Memory; + use UseTheFork\Synapse\Integrations\ClaudeIntegration; + use UseTheFork\Synapse\Integrations\Connectors\Claude\Requests\ChatRequest; + use UseTheFork\Synapse\Memory\CollectionMemory; + use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; + use UseTheFork\Synapse\Tools\Search\SerperTool; + use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; + use UseTheFork\Synapse\ValueObject\SchemaRule; + + test('Connects', function (): void { class ClaudeTestAgent extends Agent implements HasIntegration { diff --git a/tests/Integrations/OllamaIntegrationTest.php b/tests/Integrations/OllamaIntegrationTest.php index e2d9484..9fbdeb3 100644 --- a/tests/Integrations/OllamaIntegrationTest.php +++ b/tests/Integrations/OllamaIntegrationTest.php @@ -12,7 +12,7 @@ use UseTheFork\Synapse\Integrations\Connectors\Ollama\Requests\ChatRequest; use UseTheFork\Synapse\Integrations\OllamaIntegration; use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; - use UseTheFork\Synapse\Tools\SerperTool; + use UseTheFork\Synapse\Tools\Search\SerperTool; use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; use UseTheFork\Synapse\ValueObject\SchemaRule; diff --git a/tests/Integrations/OpenAiIntegrationTest.php b/tests/Integrations/OpenAiIntegrationTest.php index 086cb9b..4900af9 100644 --- a/tests/Integrations/OpenAiIntegrationTest.php +++ b/tests/Integrations/OpenAiIntegrationTest.php @@ -2,22 +2,22 @@ declare(strict_types=1); - use Saloon\Http\Faking\Fixture; - use Saloon\Http\Faking\MockClient; - use Saloon\Http\Faking\MockResponse; - use Saloon\Http\PendingRequest; - use UseTheFork\Synapse\Agent; - use UseTheFork\Synapse\Contracts\Agent\HasIntegration; - use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; - use UseTheFork\Synapse\Contracts\Integration; - use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; - use UseTheFork\Synapse\Integrations\OpenAIIntegration; - use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; - use UseTheFork\Synapse\Tools\SerperTool; - use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; - use UseTheFork\Synapse\ValueObject\SchemaRule; - - test('Connects with out resolveIntegration', function (): void { + use Saloon\Http\Faking\Fixture; + use Saloon\Http\Faking\MockClient; + use Saloon\Http\Faking\MockResponse; + use Saloon\Http\PendingRequest; + use UseTheFork\Synapse\Agent; + use UseTheFork\Synapse\Contracts\Agent\HasIntegration; + use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; + use UseTheFork\Synapse\Contracts\Integration; + use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; + use UseTheFork\Synapse\Integrations\OpenAIIntegration; + use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; + use UseTheFork\Synapse\Tools\Search\SerperTool; + use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; + use UseTheFork\Synapse\ValueObject\SchemaRule; + + test('Connects with out resolveIntegration', function (): void { class OpenAiWithOutResolveTestAgent extends Agent implements HasOutputSchema { diff --git a/tests/Memory/ConversationSummaryMemoryTest.php b/tests/Memory/ConversationSummaryMemoryTest.php index eb2df21..0f081c3 100644 --- a/tests/Memory/ConversationSummaryMemoryTest.php +++ b/tests/Memory/ConversationSummaryMemoryTest.php @@ -2,23 +2,23 @@ declare(strict_types=1); -use Saloon\Http\Faking\MockClient; -use Saloon\Http\Faking\MockResponse; -use Saloon\Http\PendingRequest; -use UseTheFork\Synapse\Agent; -use UseTheFork\Synapse\Contracts\Agent\HasMemory; -use UseTheFork\Synapse\Contracts\Integration; -use UseTheFork\Synapse\Contracts\Memory; -use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; -use UseTheFork\Synapse\Integrations\OpenAIIntegration; -use UseTheFork\Synapse\Memory\ConversationSummaryMemory; -use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; -use UseTheFork\Synapse\Tools\SerperTool; -use UseTheFork\Synapse\Traits\Agent\ManagesMemory; -use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; -use UseTheFork\Synapse\ValueObject\SchemaRule; - -it('Conversation Summary Memory', function (): void { + use Saloon\Http\Faking\MockClient; + use Saloon\Http\Faking\MockResponse; + use Saloon\Http\PendingRequest; + use UseTheFork\Synapse\Agent; + use UseTheFork\Synapse\Contracts\Agent\HasMemory; + use UseTheFork\Synapse\Contracts\Integration; + use UseTheFork\Synapse\Contracts\Memory; + use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; + use UseTheFork\Synapse\Integrations\OpenAIIntegration; + use UseTheFork\Synapse\Memory\ConversationSummaryMemory; + use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; + use UseTheFork\Synapse\Tools\Search\SerperTool; + use UseTheFork\Synapse\Traits\Agent\ManagesMemory; + use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; + use UseTheFork\Synapse\ValueObject\SchemaRule; + + it('Conversation Summary Memory', function (): void { class ConversationSummaryAgent extends Agent implements HasMemory { diff --git a/tests/Tools/SerpAPIGoogleNewsToolTest.php b/tests/Tools/SerpAPIGoogleNewsToolTest.php index 08300a0..91240fc 100644 --- a/tests/Tools/SerpAPIGoogleNewsToolTest.php +++ b/tests/Tools/SerpAPIGoogleNewsToolTest.php @@ -2,26 +2,26 @@ declare(strict_types=1); - use Saloon\Http\Faking\Fixture; - use Saloon\Http\Faking\MockClient; - use Saloon\Http\Faking\MockResponse; - use Saloon\Http\PendingRequest; - use UseTheFork\Synapse\Agent; - use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; - use UseTheFork\Synapse\Contracts\Integration; - use UseTheFork\Synapse\Contracts\Memory; - use UseTheFork\Synapse\Contracts\Tool; - use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; - use UseTheFork\Synapse\Integrations\OpenAIIntegration; - use UseTheFork\Synapse\Memory\CollectionMemory; - use UseTheFork\Synapse\Services\SerpApi\Requests\SerpApiSearchRequest; - use UseTheFork\Synapse\Tools\BaseTool; - use UseTheFork\Synapse\Tools\SerpAPIGoogleNewsTool; - use UseTheFork\Synapse\Tools\SerpAPIGoogleSearchTool; - use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; - use UseTheFork\Synapse\ValueObject\SchemaRule; - - test('Serp API Google News Tool', function (): void { + use Saloon\Http\Faking\Fixture; + use Saloon\Http\Faking\MockClient; + use Saloon\Http\Faking\MockResponse; + use Saloon\Http\PendingRequest; + use UseTheFork\Synapse\Agent; + use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; + use UseTheFork\Synapse\Contracts\Integration; + use UseTheFork\Synapse\Contracts\Memory; + use UseTheFork\Synapse\Contracts\Tool; + use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; + use UseTheFork\Synapse\Integrations\OpenAIIntegration; + use UseTheFork\Synapse\Memory\CollectionMemory; + use UseTheFork\Synapse\Services\SerpApi\Requests\SerpApiSearchRequest; + use UseTheFork\Synapse\Tools\BaseTool; + use UseTheFork\Synapse\Tools\Search\SerpAPIGoogleNewsTool; + use UseTheFork\Synapse\Tools\Search\SerpAPIGoogleSearchTool; + use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; + use UseTheFork\Synapse\ValueObject\SchemaRule; + + test('Serp API Google News Tool', function (): void { class SerpAPIGoogleNewsToolTestAgent extends Agent implements HasOutputSchema { diff --git a/tests/Tools/SerpAPIGoogleSearchToolTest.php b/tests/Tools/SerpAPIGoogleSearchToolTest.php index be9fb01..cf3ed93 100644 --- a/tests/Tools/SerpAPIGoogleSearchToolTest.php +++ b/tests/Tools/SerpAPIGoogleSearchToolTest.php @@ -2,25 +2,25 @@ declare(strict_types=1); - use Saloon\Http\Faking\Fixture; - use Saloon\Http\Faking\MockClient; - use Saloon\Http\Faking\MockResponse; - use Saloon\Http\PendingRequest; - use UseTheFork\Synapse\Agent; - use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; - use UseTheFork\Synapse\Contracts\Integration; - use UseTheFork\Synapse\Contracts\Memory; - use UseTheFork\Synapse\Contracts\Tool; - use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; - use UseTheFork\Synapse\Integrations\OpenAIIntegration; - use UseTheFork\Synapse\Memory\CollectionMemory; - use UseTheFork\Synapse\Services\SerpApi\Requests\SerpApiSearchRequest; - use UseTheFork\Synapse\Tools\BaseTool; - use UseTheFork\Synapse\Tools\SerpAPIGoogleSearchTool; - use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; - use UseTheFork\Synapse\ValueObject\SchemaRule; - - test('Serp API Tool', function (): void { + use Saloon\Http\Faking\Fixture; + use Saloon\Http\Faking\MockClient; + use Saloon\Http\Faking\MockResponse; + use Saloon\Http\PendingRequest; + use UseTheFork\Synapse\Agent; + use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; + use UseTheFork\Synapse\Contracts\Integration; + use UseTheFork\Synapse\Contracts\Memory; + use UseTheFork\Synapse\Contracts\Tool; + use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; + use UseTheFork\Synapse\Integrations\OpenAIIntegration; + use UseTheFork\Synapse\Memory\CollectionMemory; + use UseTheFork\Synapse\Services\SerpApi\Requests\SerpApiSearchRequest; + use UseTheFork\Synapse\Tools\BaseTool; + use UseTheFork\Synapse\Tools\Search\SerpAPIGoogleSearchTool; + use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; + use UseTheFork\Synapse\ValueObject\SchemaRule; + + test('Serp API Tool', function (): void { class SerpAPIGoogleSearchToolTestAgent extends Agent implements HasOutputSchema { diff --git a/tests/Tools/SerperToolTest.php b/tests/Tools/SerperToolTest.php index ec997b7..49e5c7f 100644 --- a/tests/Tools/SerperToolTest.php +++ b/tests/Tools/SerperToolTest.php @@ -2,23 +2,23 @@ declare(strict_types=1); -use Saloon\Http\Faking\Fixture; -use Saloon\Http\Faking\MockClient; -use Saloon\Http\Faking\MockResponse; -use Saloon\Http\PendingRequest; -use UseTheFork\Synapse\Agent; -use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; -use UseTheFork\Synapse\Contracts\Integration; -use UseTheFork\Synapse\Contracts\Tool; -use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; -use UseTheFork\Synapse\Integrations\OpenAIIntegration; -use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; -use UseTheFork\Synapse\Tools\BaseTool; -use UseTheFork\Synapse\Tools\SerperTool; -use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; -use UseTheFork\Synapse\ValueObject\SchemaRule; - -test('Serper Tool', function (): void { + use Saloon\Http\Faking\Fixture; + use Saloon\Http\Faking\MockClient; + use Saloon\Http\Faking\MockResponse; + use Saloon\Http\PendingRequest; + use UseTheFork\Synapse\Agent; + use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; + use UseTheFork\Synapse\Contracts\Integration; + use UseTheFork\Synapse\Contracts\Tool; + use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; + use UseTheFork\Synapse\Integrations\OpenAIIntegration; + use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; + use UseTheFork\Synapse\Tools\BaseTool; + use UseTheFork\Synapse\Tools\Search\SerperTool; + use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; + use UseTheFork\Synapse\ValueObject\SchemaRule; + + test('Serper Tool', function (): void { class SerperTestAgent extends Agent implements HasOutputSchema { diff --git a/tests/Traits/HandlesAgentEventsTest.php b/tests/Traits/HandlesAgentEventsTest.php index 33d9bb3..ec1e9f3 100644 --- a/tests/Traits/HandlesAgentEventsTest.php +++ b/tests/Traits/HandlesAgentEventsTest.php @@ -2,40 +2,40 @@ declare(strict_types=1); - use Illuminate\Support\Facades\Event; - use Saloon\Http\Faking\MockClient; - use Saloon\Http\Faking\MockResponse; - use Saloon\Http\PendingRequest; - use UseTheFork\Synapse\Agent; - use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; - use UseTheFork\Synapse\Contracts\Integration; - use UseTheFork\Synapse\Events\Agent\AgentFinish; - use UseTheFork\Synapse\Events\Agent\BootAgent; - use UseTheFork\Synapse\Events\Agent\EndIteration; - use UseTheFork\Synapse\Events\Agent\EndThread; - use UseTheFork\Synapse\Events\Agent\EndToolCall; - use UseTheFork\Synapse\Events\Agent\IntegrationResponse; - use UseTheFork\Synapse\Events\Agent\PromptGenerated; - use UseTheFork\Synapse\Events\Agent\PromptParsed; - use UseTheFork\Synapse\Events\Agent\StartIteration; - use UseTheFork\Synapse\Events\Agent\StartThread; - use UseTheFork\Synapse\Events\Agent\StartToolCall; - use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; - use UseTheFork\Synapse\Integrations\OpenAIIntegration; - use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; - use UseTheFork\Synapse\Tools\SerperTool; - use UseTheFork\Synapse\Traits\Agent\HandlesAgentEvents; - use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; - use UseTheFork\Synapse\ValueObject\SchemaRule; - - test('Handles Agent Events', function (): void { - - Event::fake(); +use Illuminate\Support\Facades\Event; +use Saloon\Http\Faking\MockClient; +use Saloon\Http\Faking\MockResponse; +use Saloon\Http\PendingRequest; +use UseTheFork\Synapse\Agent; +use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; +use UseTheFork\Synapse\Contracts\Integration; +use UseTheFork\Synapse\Events\Agent\AgentFinish; +use UseTheFork\Synapse\Events\Agent\BootAgent; +use UseTheFork\Synapse\Events\Agent\EndIteration; +use UseTheFork\Synapse\Events\Agent\EndThread; +use UseTheFork\Synapse\Events\Agent\EndToolCall; +use UseTheFork\Synapse\Events\Agent\IntegrationResponse; +use UseTheFork\Synapse\Events\Agent\PromptGenerated; +use UseTheFork\Synapse\Events\Agent\PromptParsed; +use UseTheFork\Synapse\Events\Agent\StartIteration; +use UseTheFork\Synapse\Events\Agent\StartThread; +use UseTheFork\Synapse\Events\Agent\StartToolCall; +use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; +use UseTheFork\Synapse\Integrations\OpenAIIntegration; +use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; +use UseTheFork\Synapse\Tools\Search\SerperTool; +use UseTheFork\Synapse\Traits\Agent\HandlesAgentEvents; +use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; +use UseTheFork\Synapse\ValueObject\SchemaRule; + +test('Handles Agent Events', function (): void { + + Event::fake(); class HandlesAgentEventsTestAgent extends Agent implements HasOutputSchema { - use ValidatesOutputSchema; use HandlesAgentEvents; + use ValidatesOutputSchema; protected string $promptView = 'synapse::Prompts.SimplePrompt'; @@ -48,10 +48,10 @@ public function resolveOutputSchema(): array { return [ SchemaRule::make([ - 'name' => 'answer', - 'rules' => 'required|string', - 'description' => 'your final answer to the query.', - ]), + 'name' => 'answer', + 'rules' => 'required|string', + 'description' => 'your final answer to the query.', + ]), ]; } @@ -61,14 +61,14 @@ protected function resolveTools(): array } } - MockClient::global([ - ChatRequest::class => function (PendingRequest $pendingRequest): \Saloon\Http\Faking\Fixture { - $hash = md5(json_encode($pendingRequest->body()->get('messages'))); + MockClient::global([ + ChatRequest::class => function (PendingRequest $pendingRequest): \Saloon\Http\Faking\Fixture { + $hash = md5(json_encode($pendingRequest->body()->get('messages'))); - return MockResponse::fixture("Integrations/OpenAiToolTestAgent-{$hash}"); - }, - SerperSearchRequest::class => MockResponse::fixture('Integrations/OpenAiToolTestAgent-Serper-Tool'), - ]); + return MockResponse::fixture("Integrations/OpenAiToolTestAgent-{$hash}"); + }, + SerperSearchRequest::class => MockResponse::fixture('Integrations/OpenAiToolTestAgent-Serper-Tool'), + ]); $agent = new HandlesAgentEventsTestAgent; $message = $agent->handle(['input' => 'search google for the current president of the united states.']); @@ -78,16 +78,16 @@ protected function resolveTools(): array expect($agentResponseArray['content'])->toBeArray() ->and($agentResponseArray['content'])->toHaveKey('answer'); - Event::assertDispatched(BootAgent::class); - Event::assertDispatched(StartThread::class); - Event::assertDispatched(PromptGenerated::class); - Event::assertDispatched(PromptParsed::class); - Event::assertDispatched(IntegrationResponse::class); - Event::assertDispatched(StartToolCall::class); - Event::assertDispatched(EndToolCall::class); - Event::assertDispatched(StartIteration::class); - Event::assertDispatched(EndIteration::class); - Event::assertDispatched(AgentFinish::class); - Event::assertDispatched(EndThread::class); + Event::assertDispatched(BootAgent::class); + Event::assertDispatched(StartThread::class); + Event::assertDispatched(PromptGenerated::class); + Event::assertDispatched(PromptParsed::class); + Event::assertDispatched(IntegrationResponse::class); + Event::assertDispatched(StartToolCall::class); + Event::assertDispatched(EndToolCall::class); + Event::assertDispatched(StartIteration::class); + Event::assertDispatched(EndIteration::class); + Event::assertDispatched(AgentFinish::class); + Event::assertDispatched(EndThread::class); }); diff --git a/tests/Traits/LogsAgentActivityTest.php b/tests/Traits/LogsAgentActivityTest.php index 2c68752..b8bd14f 100644 --- a/tests/Traits/LogsAgentActivityTest.php +++ b/tests/Traits/LogsAgentActivityTest.php @@ -2,33 +2,33 @@ declare(strict_types=1); - use Illuminate\Support\Facades\Event; - use Illuminate\Support\Facades\Log; - use Saloon\Http\Faking\MockClient; - use Saloon\Http\Faking\MockResponse; - use Saloon\Http\PendingRequest; - use UseTheFork\Synapse\Agent; - use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; - use UseTheFork\Synapse\Contracts\Integration; - use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; - use UseTheFork\Synapse\Integrations\OpenAIIntegration; - use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; - use UseTheFork\Synapse\Tools\SerperTool; - use UseTheFork\Synapse\Traits\Agent\LogsAgentActivity; - use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; - use UseTheFork\Synapse\ValueObject\SchemaRule; - - test('Handles Agent Logging', function (): void { - - Event::fake(); - - Log::shouldReceive('debug') - ->times(10); +use Illuminate\Support\Facades\Event; +use Illuminate\Support\Facades\Log; +use Saloon\Http\Faking\MockClient; +use Saloon\Http\Faking\MockResponse; +use Saloon\Http\PendingRequest; +use UseTheFork\Synapse\Agent; +use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; +use UseTheFork\Synapse\Contracts\Integration; +use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; +use UseTheFork\Synapse\Integrations\OpenAIIntegration; +use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; +use UseTheFork\Synapse\Tools\Search\SerperTool; +use UseTheFork\Synapse\Traits\Agent\LogsAgentActivity; +use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; +use UseTheFork\Synapse\ValueObject\SchemaRule; + +test('Handles Agent Logging', function (): void { + + Event::fake(); + + Log::shouldReceive('debug') + ->times(10); class HandlesLoggingTestAgent extends Agent implements HasOutputSchema { - use ValidatesOutputSchema; use LogsAgentActivity; + use ValidatesOutputSchema; protected string $promptView = 'synapse::Prompts.SimplePrompt'; @@ -41,10 +41,10 @@ public function resolveOutputSchema(): array { return [ SchemaRule::make([ - 'name' => 'answer', - 'rules' => 'required|string', - 'description' => 'your final answer to the query.', - ]), + 'name' => 'answer', + 'rules' => 'required|string', + 'description' => 'your final answer to the query.', + ]), ]; } @@ -54,14 +54,14 @@ protected function resolveTools(): array } } - MockClient::global([ - ChatRequest::class => function (PendingRequest $pendingRequest): \Saloon\Http\Faking\Fixture { - $hash = md5(json_encode($pendingRequest->body()->get('messages'))); + MockClient::global([ + ChatRequest::class => function (PendingRequest $pendingRequest): \Saloon\Http\Faking\Fixture { + $hash = md5(json_encode($pendingRequest->body()->get('messages'))); - return MockResponse::fixture("Integrations/OpenAiToolTestAgent-{$hash}"); - }, - SerperSearchRequest::class => MockResponse::fixture('Integrations/OpenAiToolTestAgent-Serper-Tool'), - ]); + return MockResponse::fixture("Integrations/OpenAiToolTestAgent-{$hash}"); + }, + SerperSearchRequest::class => MockResponse::fixture('Integrations/OpenAiToolTestAgent-Serper-Tool'), + ]); $agent = new HandlesLoggingTestAgent; $message = $agent->handle(['input' => 'search google for the current president of the united states.']); diff --git a/tests/Traits/ManagesHooksTest.php b/tests/Traits/ManagesHooksTest.php index 600a228..6c18340 100644 --- a/tests/Traits/ManagesHooksTest.php +++ b/tests/Traits/ManagesHooksTest.php @@ -2,45 +2,45 @@ declare(strict_types=1); - use Illuminate\Support\Facades\Event; - use Saloon\Http\Faking\MockClient; - use Saloon\Http\Faking\MockResponse; - use Saloon\Http\PendingRequest; - use UseTheFork\Synapse\Agent; - use UseTheFork\Synapse\AgentTask\PendingAgentTask; - use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; - use UseTheFork\Synapse\Contracts\Agent\Hooks\HasAgentFinishHook; - use UseTheFork\Synapse\Contracts\Agent\Hooks\HasBootAgentHook; - use UseTheFork\Synapse\Contracts\Agent\Hooks\HasEndIterationHook; - use UseTheFork\Synapse\Contracts\Agent\Hooks\HasEndThreadHook; - use UseTheFork\Synapse\Contracts\Agent\Hooks\HasEndToolCallHook; - use UseTheFork\Synapse\Contracts\Agent\Hooks\HasIntegrationResponseHook; - use UseTheFork\Synapse\Contracts\Agent\Hooks\HasPromptGeneratedHook; - use UseTheFork\Synapse\Contracts\Agent\Hooks\HasPromptParsedHook; - use UseTheFork\Synapse\Contracts\Agent\Hooks\HasStartIterationHook; - use UseTheFork\Synapse\Contracts\Agent\Hooks\HasStartThreadHook; - use UseTheFork\Synapse\Contracts\Agent\Hooks\HasStartToolCallHook; - use UseTheFork\Synapse\Contracts\Integration; - use UseTheFork\Synapse\Events\Agent\AgentFinish; - use UseTheFork\Synapse\Events\Agent\BootAgent; - use UseTheFork\Synapse\Events\Agent\EndIteration; - use UseTheFork\Synapse\Events\Agent\EndThread; - use UseTheFork\Synapse\Events\Agent\EndToolCall; - use UseTheFork\Synapse\Events\Agent\IntegrationResponse; - use UseTheFork\Synapse\Events\Agent\PromptGenerated; - use UseTheFork\Synapse\Events\Agent\PromptParsed; - use UseTheFork\Synapse\Events\Agent\StartIteration; - use UseTheFork\Synapse\Events\Agent\StartThread; - use UseTheFork\Synapse\Events\Agent\StartToolCall; - use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; - use UseTheFork\Synapse\Integrations\OpenAIIntegration; - use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; - use UseTheFork\Synapse\Tools\SerperTool; - use UseTheFork\Synapse\Traits\Agent\ManagesHooks; - use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; - use UseTheFork\Synapse\ValueObject\SchemaRule; - - test('Handles Agent Events', closure: function (): void { + use Illuminate\Support\Facades\Event; + use Saloon\Http\Faking\MockClient; + use Saloon\Http\Faking\MockResponse; + use Saloon\Http\PendingRequest; + use UseTheFork\Synapse\Agent; + use UseTheFork\Synapse\AgentTask\PendingAgentTask; + use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; + use UseTheFork\Synapse\Contracts\Agent\Hooks\HasAgentFinishHook; + use UseTheFork\Synapse\Contracts\Agent\Hooks\HasBootAgentHook; + use UseTheFork\Synapse\Contracts\Agent\Hooks\HasEndIterationHook; + use UseTheFork\Synapse\Contracts\Agent\Hooks\HasEndThreadHook; + use UseTheFork\Synapse\Contracts\Agent\Hooks\HasEndToolCallHook; + use UseTheFork\Synapse\Contracts\Agent\Hooks\HasIntegrationResponseHook; + use UseTheFork\Synapse\Contracts\Agent\Hooks\HasPromptGeneratedHook; + use UseTheFork\Synapse\Contracts\Agent\Hooks\HasPromptParsedHook; + use UseTheFork\Synapse\Contracts\Agent\Hooks\HasStartIterationHook; + use UseTheFork\Synapse\Contracts\Agent\Hooks\HasStartThreadHook; + use UseTheFork\Synapse\Contracts\Agent\Hooks\HasStartToolCallHook; + use UseTheFork\Synapse\Contracts\Integration; + use UseTheFork\Synapse\Events\Agent\AgentFinish; + use UseTheFork\Synapse\Events\Agent\BootAgent; + use UseTheFork\Synapse\Events\Agent\EndIteration; + use UseTheFork\Synapse\Events\Agent\EndThread; + use UseTheFork\Synapse\Events\Agent\EndToolCall; + use UseTheFork\Synapse\Events\Agent\IntegrationResponse; + use UseTheFork\Synapse\Events\Agent\PromptGenerated; + use UseTheFork\Synapse\Events\Agent\PromptParsed; + use UseTheFork\Synapse\Events\Agent\StartIteration; + use UseTheFork\Synapse\Events\Agent\StartThread; + use UseTheFork\Synapse\Events\Agent\StartToolCall; + use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; + use UseTheFork\Synapse\Integrations\OpenAIIntegration; + use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; + use UseTheFork\Synapse\Tools\Search\SerperTool; + use UseTheFork\Synapse\Traits\Agent\ManagesHooks; + use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; + use UseTheFork\Synapse\ValueObject\SchemaRule; + + test('Handles Agent Events', closure: function (): void { Event::fake(); From 1290b941e1df520e6b46873eecbe7a206a4b345f Mon Sep 17 00:00:00 2001 From: use-the-fork Date: Tue, 22 Oct 2024 19:00:27 -0400 Subject: [PATCH 2/7] refactor(tools)!: restructure FirecrawlTool and update FirecrawlRequest MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Moved `FirecrawlTool` to `Tools\Scrape` namespace and implemented `ScrapeTool` interface. - Simplified `FirecrawlRequest` by removing extraction prompt and schema definition. - Adjusted dependencies and tests to reflect these changes. πŸš€ --- src/Contracts/Tool/ScrapeTool.php | 12 ++ .../Firecrawl/Requests/FirecrawlRequest.php | 32 +--- src/Tools/{ => Scrape}/FirecrawlTool.php | 17 ++- ...Tool-4045f581b66dc3e16fa0edbf3869dc68.json | 10 -- ...Tool-43bcd63cc9d9b98eb8488d0e1a4c4174.json | 31 +--- ...Tool-57eb596433503d505d08b167660e1980.json | 9 -- ...Tool-76cdcfb02f44fe52a23d1c7248cd0cae.json | 14 ++ .../Saloon/Tools/FirecrawlTool-Tool.json | 8 +- ...Tool-ab05a60a52727034e24aa4e6cf67e965.json | 31 ---- tests/Tools/FirecrawlToolTest.php | 142 +++++++++--------- 10 files changed, 123 insertions(+), 183 deletions(-) create mode 100644 src/Contracts/Tool/ScrapeTool.php rename src/Tools/{ => Scrape}/FirecrawlTool.php (76%) delete mode 100644 tests/Fixtures/Saloon/Tools/FirecrawlTool-4045f581b66dc3e16fa0edbf3869dc68.json delete mode 100644 tests/Fixtures/Saloon/Tools/FirecrawlTool-57eb596433503d505d08b167660e1980.json create mode 100644 tests/Fixtures/Saloon/Tools/FirecrawlTool-76cdcfb02f44fe52a23d1c7248cd0cae.json delete mode 100644 tests/Fixtures/Saloon/Tools/FirecrawlTool-ab05a60a52727034e24aa4e6cf67e965.json diff --git a/src/Contracts/Tool/ScrapeTool.php b/src/Contracts/Tool/ScrapeTool.php new file mode 100644 index 0000000..fbdeb33 --- /dev/null +++ b/src/Contracts/Tool/ScrapeTool.php @@ -0,0 +1,12 @@ + $this->url, + 'formats' => ['markdown'] + ]; } /** * {@inheritdoc} */ - public function defaultBody(): array + public function resolveEndpoint(): string { - return [ - 'url' => $this->url, - 'formats' => ['extract'], - 'extract' => [ - 'schema' => [ - 'type' => 'object', - 'properties' => [ - 'result' => [ - 'description' => "detailed markdown list related to **{$this->extractionPrompt}** if no relevant content is found return `No Relevant Content On Page` DO NOT respond with only a URL or Link.", - 'type' => 'string', - ], - ], - 'required' => [ - 'result', - ], - ], - ], - ]; + return '/v1/scrape'; } } diff --git a/src/Tools/FirecrawlTool.php b/src/Tools/Scrape/FirecrawlTool.php similarity index 76% rename from src/Tools/FirecrawlTool.php rename to src/Tools/Scrape/FirecrawlTool.php index 65cc8c0..f43f41b 100644 --- a/src/Tools/FirecrawlTool.php +++ b/src/Tools/Scrape/FirecrawlTool.php @@ -2,13 +2,15 @@ declare(strict_types=1); -namespace UseTheFork\Synapse\Tools; +namespace UseTheFork\Synapse\Tools\Scrape; +use UseTheFork\Synapse\Contracts\Tool\ScrapeTool; use UseTheFork\Synapse\Exceptions\MissingApiKeyException; use UseTheFork\Synapse\Services\Firecrawl\FirecrawlConnector; use UseTheFork\Synapse\Services\Firecrawl\Requests\FirecrawlRequest; +use UseTheFork\Synapse\Tools\BaseTool; -final class FirecrawlTool extends BaseTool +final class FirecrawlTool extends BaseTool implements ScrapeTool { private string $apiKey; @@ -25,15 +27,14 @@ public function __construct() * Useful for getting the contents of a webpage. * * @param string $url The full URL to get the contents from. - * @param string $extractionPrompt A prompt describing what information to extract from the page + * */ public function handle( - string $url, - string $extractionPrompt, + string $url ): string { $firecrawlConnector = new FirecrawlConnector($this->apiKey); - $firecrawlRequest = new FirecrawlRequest($url, $extractionPrompt); + $firecrawlRequest = new FirecrawlRequest($url); $results = $firecrawlConnector->send($firecrawlRequest)->array(); @@ -52,8 +53,8 @@ private function parseResults(array $results): string $snippets->push("Meta Description: {$results['data']['extract']['metadata']['description']}"); } - if (! empty($results['data']['extract']['result'])) { - $snippets->push("Content:\n {$results['data']['extract']['result']}"); + if (! empty($results['data']['markdown'])) { + $snippets->push("Content:\n\n {$results['data']['markdown']}"); } if ($snippets->isEmpty()) { diff --git a/tests/Fixtures/Saloon/Tools/FirecrawlTool-4045f581b66dc3e16fa0edbf3869dc68.json b/tests/Fixtures/Saloon/Tools/FirecrawlTool-4045f581b66dc3e16fa0edbf3869dc68.json deleted file mode 100644 index 6eae140..0000000 --- a/tests/Fixtures/Saloon/Tools/FirecrawlTool-4045f581b66dc3e16fa0edbf3869dc68.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Fri, 04 Oct 2024 13:33:54 GMT", - "Content-Type": "application\/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AEcjJY2nt7KLnEhgSY83fSC7OXafR\",\n \"object\": \"chat.completion\",\n \"created\": 1728048833,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_sAg3DjOruYzDJrfEfJuk3AOT\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"firecrawl_tool\",\n \"arguments\": \"{\\\"url\\\":\\\"https:\/\/www.firecrawl.dev\/\\\",\\\"extractionPrompt\\\":\\\"Describe the main purpose or topic of the webpage.\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 141,\n \"completion_tokens\": 36,\n \"total_tokens\": 177,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_81dd8129df\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/FirecrawlTool-43bcd63cc9d9b98eb8488d0e1a4c4174.json b/tests/Fixtures/Saloon/Tools/FirecrawlTool-43bcd63cc9d9b98eb8488d0e1a4c4174.json index 41ff66b..24d7dd0 100644 --- a/tests/Fixtures/Saloon/Tools/FirecrawlTool-43bcd63cc9d9b98eb8488d0e1a4c4174.json +++ b/tests/Fixtures/Saloon/Tools/FirecrawlTool-43bcd63cc9d9b98eb8488d0e1a4c4174.json @@ -1,31 +1,10 @@ { "statusCode": 200, "headers": { - "Date": "Tue, 22 Oct 2024 01:29:15 GMT", + "Date": "Tue, 22 Oct 2024 22:56:26 GMT", "Content-Type": "application\/json", - "Content-Length": "1001", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "1423", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999868", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "3ms", - "x-request-id": "req_83947e3fedb8e55c0cecd4763dc7106a", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=kl0HCYhDWdQBHgu.au70qqhChKk5RaAT1LEbZ7.6R18-1729560555-1.0.1.1-QcPuKMjTG83kHEndnvp.zEX6Q9wx94nCOc_NpD56yCySJKLKQ._VUZyb7N9NQW6MVPNcwO32Qxwp_YrIcZYu2A; path=\/; expires=Tue, 22-Oct-24 01:59:15 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=.MwFI73GnUCEax2U8GwoTYEDfqLLG6ccDc.TIosZQrY-1729560555299-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b714de574252-EWR", - "alt-svc": "h3=\":443\"; ma=86400" + "Content-Length": "925", + "Connection": "keep-alive" }, - "data": "{\n \"id\": \"chatcmpl-AKxzt9uuS0RxiTGLtYoHR26gRNPjy\",\n \"object\": \"chat.completion\",\n \"created\": 1729560553,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_N1tuNKzGU3rp68ipitruNElF\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"firecrawl_tool\",\n \"arguments\": \"{\\\"url\\\":\\\"https:\/\/www.firecrawl.dev\/\\\",\\\"extractionPrompt\\\":\\\"Describe the main purpose or focus of the website.\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 176,\n \"completion_tokens\": 36,\n \"total_tokens\": 212,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} \ No newline at end of file + "data": "{\n \"id\": \"chatcmpl-ALI5ZTtwrc2JUdgmRZt21iOD939Rz\",\n \"object\": \"chat.completion\",\n \"created\": 1729637785,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_YjRmsL5iZolFwHFh6Gm3r8qM\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"firecrawl_tool\",\n \"arguments\": \"{\\\"url\\\":\\\"https:\/\/www.firecrawl.dev\/\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 158,\n \"completion_tokens\": 21,\n \"total_tokens\": 179,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Tools/FirecrawlTool-57eb596433503d505d08b167660e1980.json b/tests/Fixtures/Saloon/Tools/FirecrawlTool-57eb596433503d505d08b167660e1980.json deleted file mode 100644 index 3427e5b..0000000 --- a/tests/Fixtures/Saloon/Tools/FirecrawlTool-57eb596433503d505d08b167660e1980.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Fri, 04 Oct 2024 13:48:07 GMT", - "Content-Type": "application/json", - "Transfer-Encoding": "chunked" - }, - "data": "{\n \"id\": \"chatcmpl-AEcx0nuS49mxVK0uzfVlDFeTQVgeB\",\n \"object\": \"chat.completion\",\n \"created\": 1728049682,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"The 'https://www.firecrawl.dev/' webpage is about Firecrawl, a web scraping tool designed for extracting, cleaning, and converting web data into formats suitable for AI applications, especially Large Language Models (LLMs). It features capabilities to crawl pages, handle dynamic content, and provide data in clean markdown or structured formats. It targets LLM engineers, data scientists, and AI researchers, offering multiple pricing plans and integration options with popular frameworks. The tool is also open-source.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 462,\n \"completion_tokens\": 108,\n \"total_tokens\": 570,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_68a5bb159e\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/FirecrawlTool-76cdcfb02f44fe52a23d1c7248cd0cae.json b/tests/Fixtures/Saloon/Tools/FirecrawlTool-76cdcfb02f44fe52a23d1c7248cd0cae.json new file mode 100644 index 0000000..95ce921 --- /dev/null +++ b/tests/Fixtures/Saloon/Tools/FirecrawlTool-76cdcfb02f44fe52a23d1c7248cd0cae.json @@ -0,0 +1,14 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 22 Oct 2024 22:57:22 GMT", + "Content-Type": "application\/json", + "Content-Length": "1186", + "Connection": "keep-alive", + "access-control-expose-headers": "X-Request-ID", + "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", + "openai-processing-ms": "3408", + "openai-version": "2020-10-01" + }, + "data": "{\n \"id\": \"chatcmpl-ALI6RfAUfMgMidYGCNGnNrynJLpTD\",\n \"object\": \"chat.completion\",\n \"created\": 1729637839,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"The 'https:\/\/www.firecrawl.dev\/' page is about Firecrawl, a service that allows users to crawl and scrape data from websites, transforming it into clean, structured markdown or data that is ready for LLM (Large Language Models) applications. It provides various features including handling dynamic content, rotating proxies, and scraping without needing a sitemap. Firecrawl offers different pricing plans, is open source, and aims to power AI applications by providing reliable, clean data extracted from any website.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 5112,\n \"completion_tokens\": 110,\n \"total_tokens\": 5222,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Tools/FirecrawlTool-Tool.json b/tests/Fixtures/Saloon/Tools/FirecrawlTool-Tool.json index 15272c5..d1d1690 100644 --- a/tests/Fixtures/Saloon/Tools/FirecrawlTool-Tool.json +++ b/tests/Fixtures/Saloon/Tools/FirecrawlTool-Tool.json @@ -1,9 +1,9 @@ { "statusCode": 200, "headers": { - "x-powered-by": "Express", - "access-control-allow-origin": "*", - "content-type": "application\/json; charset=utf-8" + "X-Powered-By": "Express", + "Access-Control-Allow-Origin": "*", + "Content-Type": "application\/json; charset=utf-8" }, - "data": "{\"success\":true,\"data\":{\"extract\":{\"result\":\"- **Main Topic**: The webpage is about Firecrawl, a web scraping tool designed to extract, clean, and convert web data into formats suitable for AI applications, particularly LLMs (Large Language Models).\\n\\n- **Key Features**:\\n - Crawl and scrape accessible subpages with no sitemap required.\\n - Returns clean markdown or structured data useful for training AI applications.\\n - Capable of handling dynamic content rendered with JavaScript.\\n - Built with reliability in mind, ensuring users receive the latest data without caching.\\n\\n- **Target Audience**: The service targets LLM engineers, data scientists, AI researchers, and developers looking to make use of web data for various purposes including machine learning model training and content aggregation.\\n\\n- **Business Model**: Firecrawl offers multiple pricing plans that allow users to start for free with 500 credits and scale up based on their scraping needs. There are options for free, hobbyist, standard, growth, and enterprise plans.\\n\\n- **Integration**: The tool integrates with popular frameworks like LlamaIndex, Langchain, and others to facilitate the development of AI applications.\\n\\n- **Open Source**: Firecrawl is open-source, inviting contributions from the community.\\n\\n- **Support**: The webpage includes an FAQ section addressing concerns regarding functionality, pricing, data credit costs, crawling limitations, and more, thus providing support to potential or existing users.\"},\"metadata\":{\"title\":\"Home - Firecrawl\",\"description\":\"Firecrawl crawls and converts any website into clean markdown.\",\"language\":\"en\",\"keywords\":\"Firecrawl,Markdown,Data,Mendable,Langchain\",\"robots\":\"follow, index\",\"ogTitle\":\"Firecrawl\",\"ogDescription\":\"Turn any website into LLM-ready data.\",\"ogUrl\":\"https:\/\/www.firecrawl.dev\/\",\"ogImage\":\"https:\/\/www.firecrawl.dev\/og.png?123\",\"ogLocaleAlternate\":[],\"ogSiteName\":\"Firecrawl\",\"sourceURL\":\"https:\/\/www.firecrawl.dev\/\",\"sitemap\":{\"changefreq\":\"weekly\",\"lastmod\":\"2024-10-03T20:51:47.851Z\"},\"statusCode\":200}}}" + "data": "{\"success\":true,\"data\":{\"markdown\":\"Our first Launch Week is over! [See the recap \ud83d\ude80](blog\/firecrawl-launch-week-1-recap)\\n\\n[\ud83d\udca5 Get 2 months free with yearly plan](\/pricing)\\n\\nTurn websites into \\n_LLM-ready_ data\\n=====================================\\n\\nPower your AI apps with clean data crawled from any website. It's also open-source.\\n\\nStart for free (500 credits)Start for free[Talk to us](https:\/\/calendly.com\/d\/cj83-ngq-knk\/meet-firecrawl)\\n\\nA product by\\n\\n[![Mendable Logo](https:\/\/www.firecrawl.dev\/images\/mendable_logo_transparent.png)Mendable](https:\/\/mendable.ai)\\n\\n![Example Webpage](https:\/\/www.firecrawl.dev\/multiple-websites.png)\\n\\nCrawl, Scrape, Clean\\n--------------------\\n\\nWe crawl all accessible subpages and give you clean markdown for each. No sitemap required.\\n\\n \\n [\\\\\\n {\\\\\\n \\\"url\\\": \\\"https:\/\/www.firecrawl.dev\/\\\",\\\\\\n \\\"markdown\\\": \\\"## Welcome to Firecrawl\\\\\\n Firecrawl is a web scraper that allows you to extract the content of a webpage.\\\"\\\\\\n },\\\\\\n {\\\\\\n \\\"url\\\": \\\"https:\/\/www.firecrawl.dev\/features\\\",\\\\\\n \\\"markdown\\\": \\\"## Features\\\\\\n Discover how Firecrawl's cutting-edge features can \\\\\\n transform your data operations.\\\"\\\\\\n },\\\\\\n {\\\\\\n \\\"url\\\": \\\"https:\/\/www.firecrawl.dev\/pricing\\\",\\\\\\n \\\"markdown\\\": \\\"## Pricing Plans\\\\\\n Choose the perfect plan that fits your needs.\\\"\\\\\\n },\\\\\\n {\\\\\\n \\\"url\\\": \\\"https:\/\/www.firecrawl.dev\/about\\\",\\\\\\n \\\"markdown\\\": \\\"## About Us\\\\\\n Learn more about Firecrawl's mission and the \\\\\\n team behind our innovative platform.\\\"\\\\\\n }\\\\\\n ]\\n \\n\\nNote: The markdown has been edited for display purposes.\\n\\nTrusted by Top Companies\\n------------------------\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/zapier.png)](https:\/\/www.zapier.com)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/gamma.svg)](https:\/\/gamma.app)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/nvidia-com.png)](https:\/\/www.nvidia.com)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/teller-io.svg)](https:\/\/www.teller.io)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/stackai.svg)](https:\/\/www.stack-ai.com)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/palladiumdigital-co-uk.svg)](https:\/\/www.palladiumdigital.co.uk)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/worldwide-casting-com.svg)](https:\/\/www.worldwide-casting.com)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/open-gov-sg.png)](https:\/\/www.open.gov.sg)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/bain-com.svg)](https:\/\/www.bain.com)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/demand-io.svg)](https:\/\/www.demand.io)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/carrefour-logo-1.svg)](https:\/\/www.carrefour.com)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/cyberagent-co-jp.svg)](https:\/\/www.cyberagent.co.jp)\\n\\nIntegrate today\\n---------------\\n\\nEnhance your applications with top-tier web scraping and crawling capabilities.\\n\\n#### Scrape\\n\\nExtract markdown or structured data from websites quickly and efficiently.\\n\\n#### Crawling\\n\\nNavigate and retrieve data from all accessible subpages, even without a sitemap.\\n\\n1\\n\\n2\\n\\n3\\n\\n4\\n\\n5\\n\\n6\\n\\n7\\n\\n8\\n\\n9\\n\\n10\\n\\n\/\/ npm install @mendable\/firecrawl-js \\n \\nimport FirecrawlApp from '@mendable\/firecrawl-js'; \\n \\nconst app \\\\= new FirecrawlApp({ apiKey: \\\"fc-YOUR\\\\_API\\\\_KEY\\\" }); \\n \\n\/\/ Scrape a website: \\nconst scrapeResult \\\\= await app.scrapeUrl('firecrawl.dev'); \\n \\nconsole.log(scrapeResult.data.markdown)\\n\\n#### Use well-known tools\\n\\nAlready fully integrated with the greatest existing tools and workflows.\\n\\n[![LlamaIndex](https:\/\/www.firecrawl.dev\/logos\/llamaindex.svg)](https:\/\/docs.llamaindex.ai\/en\/stable\/examples\/data_connectors\/WebPageDemo\/#using-firecrawl-reader\/)\\n[![Langchain](https:\/\/www.firecrawl.dev\/integrations\/langchain.png)](https:\/\/python.langchain.com\/v0.2\/docs\/integrations\/document_loaders\/firecrawl\/)\\n[![Dify](https:\/\/www.firecrawl.dev\/logos\/dify.png)](https:\/\/dify.ai\/blog\/dify-ai-blog-integrated-with-firecrawl\/)\\n[![Dify](https:\/\/www.firecrawl.dev\/integrations\/langflow_2.png)](https:\/\/www.langflow.org\/)\\n[![Flowise](https:\/\/www.firecrawl.dev\/integrations\/flowise.png)](https:\/\/flowiseai.com\/)\\n[![CrewAI](https:\/\/www.firecrawl.dev\/integrations\/crewai.png)](https:\/\/crewai.com\/)\\n\\n#### Start for free, scale easily\\n\\nKick off your journey for free and scale seamlessly as your project expands.\\n\\n[Try it out](\/signin\/signup)\\n\\n#### Open-source\\n\\nDeveloped transparently and collaboratively. Join our community of contributors.\\n\\n[Check out our repo](https:\/\/github.com\/mendableai\/firecrawl)\\n\\nWe handle the hard stuff\\n------------------------\\n\\nRotating proxies, orchestration, rate limits, js-blocked content and more\\n\\n#### Crawling\\n\\nFirecrawl crawls all accessible subpages, even without a sitemap.\\n\\n#### Dynamic content\\n\\nFirecrawl gathers data even if a website uses javascript to render content.\\n\\n#### To Markdown\\n\\nFirecrawl returns clean, well formatted markdown - ready for use in LLM applications\\n\\n#### Reliability first\\n\\nReliability is our core focus. Firecrawl is designed to ensure you get all the data you need.\\n\\n#### No Caching\\n\\nFirecrawl doesn't cache content by default. You always get the latest data.\\n\\n#### Built for AI\\n\\nBuilt by LLM engineers, for LLM engineers. Giving you clean data the way you want it.\\n\\n#### Smart Wait\\n\\nFirecrawl can intelligently wait for content to load, making scraping faster and more reliable.\\n\\n#### Actions\\n\\nClick, scroll, write, wait, press and more before extracting content.\\n\\n#### Media Parsing\\n\\nFirecrawl can parse and output clean content from web hosted pdfs, docx, images and more.\\n\\nOur wall of love\\n\\nDon't take our word for it\\n--------------------------\\n\\n![Greg Kamradt](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-02.0afeb750.jpg&w=96&q=75)\\n\\nGreg Kamradt\\n\\n[@GregKamradt](https:\/\/twitter.com\/GregKamradt\/status\/1780300642197840307)\\n\\nLLM structured data via API, handling requests, cleaning, and crawling. Enjoyed the early preview.\\n\\n![Amit Naik](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-03.ff5dbe11.jpg&w=96&q=75)\\n\\nAmit Naik\\n\\n[@suprgeek](https:\/\/twitter.com\/suprgeek\/status\/1780338213351035254)\\n\\n#llm success with RAG relies on Retrieval. Firecrawl by @mendableai structures web content for processing. \ud83d\udc4f\\n\\n![Jerry Liu](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-04.76bef0df.jpg&w=96&q=75)\\n\\nJerry Liu\\n\\n[@jerryjliu0](https:\/\/twitter.com\/jerryjliu0\/status\/1781122933349572772)\\n\\nFirecrawl is awesome \ud83d\udd25 Turns web pages into structured markdown for LLM apps, thanks to @mendableai.\\n\\n![Bardia Pourvakil](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-01.025350bc.jpeg&w=96&q=75)\\n\\nBardia Pourvakil\\n\\n[@thepericulum](https:\/\/twitter.com\/thepericulum\/status\/1781397799487078874)\\n\\nThese guys ship. I wanted types for their node SDK, and less than an hour later, I got them. Can't recommend them enough.\\n\\n![latentsauce \ud83e\uddd8\ud83c\udffd](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-07.c2285d35.jpeg&w=96&q=75)\\n\\nlatentsauce \ud83e\uddd8\ud83c\udffd\\n\\n[@latentsauce](https:\/\/twitter.com\/latentsauce\/status\/1781738253927735331)\\n\\nFirecrawl simplifies data preparation significantly, exactly what I was hoping for. Thank you for creating Firecrawl \u2764\ufe0f\u2764\ufe0f\u2764\ufe0f\\n\\n![Greg Kamradt](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-02.0afeb750.jpg&w=96&q=75)\\n\\nGreg Kamradt\\n\\n[@GregKamradt](https:\/\/twitter.com\/GregKamradt\/status\/1780300642197840307)\\n\\nLLM structured data via API, handling requests, cleaning, and crawling. Enjoyed the early preview.\\n\\n![Amit Naik](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-03.ff5dbe11.jpg&w=96&q=75)\\n\\nAmit Naik\\n\\n[@suprgeek](https:\/\/twitter.com\/suprgeek\/status\/1780338213351035254)\\n\\n#llm success with RAG relies on Retrieval. Firecrawl by @mendableai structures web content for processing. \ud83d\udc4f\\n\\n![Jerry Liu](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-04.76bef0df.jpg&w=96&q=75)\\n\\nJerry Liu\\n\\n[@jerryjliu0](https:\/\/twitter.com\/jerryjliu0\/status\/1781122933349572772)\\n\\nFirecrawl is awesome \ud83d\udd25 Turns web pages into structured markdown for LLM apps, thanks to @mendableai.\\n\\n![Bardia Pourvakil](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-01.025350bc.jpeg&w=96&q=75)\\n\\nBardia Pourvakil\\n\\n[@thepericulum](https:\/\/twitter.com\/thepericulum\/status\/1781397799487078874)\\n\\nThese guys ship. I wanted types for their node SDK, and less than an hour later, I got them. Can't recommend them enough.\\n\\n![latentsauce \ud83e\uddd8\ud83c\udffd](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-07.c2285d35.jpeg&w=96&q=75)\\n\\nlatentsauce \ud83e\uddd8\ud83c\udffd\\n\\n[@latentsauce](https:\/\/twitter.com\/latentsauce\/status\/1781738253927735331)\\n\\nFirecrawl simplifies data preparation significantly, exactly what I was hoping for. Thank you for creating Firecrawl \u2764\ufe0f\u2764\ufe0f\u2764\ufe0f\\n\\n![Michael Ning](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-05.76d7cd3e.png&w=96&q=75)\\n\\nMichael Ning\\n\\n[](#)\\n\\nFirecrawl is impressive, saving us 2\/3 the tokens and allowing gpt3.5turbo use over gpt4. Major savings in time and money.\\n\\n![Alex Reibman \ud83d\udd87\ufe0f](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-06.4ee7cf5a.jpeg&w=96&q=75)\\n\\nAlex Reibman \ud83d\udd87\ufe0f\\n\\n[@AlexReibman](https:\/\/twitter.com\/AlexReibman\/status\/1780299595484131836)\\n\\nMoved our internal agent's web scraping tool from Apify to Firecrawl because it benchmarked 50x faster with AgentOps.\\n\\n![Michael](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-08.0bed40be.jpeg&w=96&q=75)\\n\\nMichael\\n\\n[@michael\\\\_chomsky](#)\\n\\nI really like some of the design decisions Firecrawl made, so I really want to share with others.\\n\\n![Paul Scott](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-09.d303b5b4.png&w=96&q=75)\\n\\nPaul Scott\\n\\n[@palebluepaul](https:\/\/twitter.com\/palebluepaul)\\n\\nAppreciating your lean approach, Firecrawl ticks off everything on our list without the cost prohibitive overkill.\\n\\n![Michael Ning](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-05.76d7cd3e.png&w=96&q=75)\\n\\nMichael Ning\\n\\n[](#)\\n\\nFirecrawl is impressive, saving us 2\/3 the tokens and allowing gpt3.5turbo use over gpt4. Major savings in time and money.\\n\\n![Alex Reibman \ud83d\udd87\ufe0f](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-06.4ee7cf5a.jpeg&w=96&q=75)\\n\\nAlex Reibman \ud83d\udd87\ufe0f\\n\\n[@AlexReibman](https:\/\/twitter.com\/AlexReibman\/status\/1780299595484131836)\\n\\nMoved our internal agent's web scraping tool from Apify to Firecrawl because it benchmarked 50x faster with AgentOps.\\n\\n![Michael](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-08.0bed40be.jpeg&w=96&q=75)\\n\\nMichael\\n\\n[@michael\\\\_chomsky](#)\\n\\nI really like some of the design decisions Firecrawl made, so I really want to share with others.\\n\\n![Paul Scott](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-09.d303b5b4.png&w=96&q=75)\\n\\nPaul Scott\\n\\n[@palebluepaul](https:\/\/twitter.com\/palebluepaul)\\n\\nAppreciating your lean approach, Firecrawl ticks off everything on our list without the cost prohibitive overkill.\\n\\nFlexible Pricing\\n----------------\\n\\nStart for free, then scale as you grow\\n\\nYearly (17% off)Yearly (2 months free)Monthly\\n\\nFree Plan\\n---------\\n\\n500 credits\\n\\n$0 one-time\\n\\nNo credit card requiredGet Started\\n\\n* Scrape 500 pages\\n* 10 \/scrape per min\\n* 1 \/crawl per min\\n\\nHobby\\n-----\\n\\n3,000 credits per month\\n\\n$16\/month\\n\\n$228\/yr$190\/yr (Billed annually)\\n\\nSubscribe$158\/yr\\n\\n* Scrape 3,000 pages\\\\*\\n* 20 \/scrape per min\\n* 3 \/crawl per min\\n\\nStandardMost Popular\\n--------------------\\n\\n100,000 credits per month\\n\\n$83\/month\\n\\n$1188\/yr$990\/yr (Billed annually)\\n\\nSubscribe$822\/yr\\n\\n* Scrape 100,000 pages\\\\*\\n* 100 \/scrape per min\\n* 10 \/crawl per min\\n* 2 seats\\n\\nGrowth\\n------\\n\\n500,000 credits per month\\n\\n$333\/month\\n\\n$4788\/yr$3990\/yr (Billed annually)\\n\\nSubscribe$3312\/yr\\n\\n* Scrape 500,000 pages\\\\*\\n* 1000 \/scrape per min\\n* 50 \/crawl per min\\n* 4 seats\\n* Priority Support\\n\\nEnterprise Plan\\n---------------\\n\\nUnlimited credits. Custom RPMs.\\n\\nTalk to us\\n\\n* Top priority support\\n* Feature Acceleration\\n* SLAs\\n* Account Manager\\n* Custom rate limits volume\\n* Custom concurrency limits\\n* Custom seats\\n* CEO's number\\n\\n\\\\* a \/scrape refers to the [scrape](https:\/\/docs.firecrawl.dev\/api-reference\/endpoint\/scrape)\\n API endpoint. Structured extraction costs vary. See [credits table](\/pricing#credits)\\n.\\n\\n\\\\* a \/crawl refers to the [crawl](https:\/\/docs.firecrawl.dev\/api-reference\/endpoint\/crawl)\\n API endpoint.\\n\\nAPI Credits\\n-----------\\n\\nCredits are consumed for each API request, varying by endpoint and feature.\\n\\n| Features | Credits |\\n| --- | --- |\\n| Scrape(\/scrape) | 1 \/ page |\\n| Crawl(\/crawl) | 1 \/ page |\\n| Map (\/map) | 1 \/ call |\\n| Search(\/search) | 1 \/ page |\\n| Scrape + LLM extraction (\/scrape) | 5 \/ page |\\n\\n[\ud83d\udd25](\/)\\n\\nReady to _Build?_\\n-----------------\\n\\nStart scraping web data for your AI apps today. \\nNo credit card needed.\\n\\n[Get Started](\/signin)\\n\\n[Talk to us](https:\/\/calendly.com\/d\/cj83-ngq-knk\/meet-firecrawl)\\n\\nFAQ\\n---\\n\\nFrequently asked questions about Firecrawl\\n\\n#### General\\n\\nWhat is Firecrawl?\\n\\nFirecrawl turns entire websites into clean, LLM-ready markdown or structured data. Scrape, crawl and extract the web with a single API. Ideal for AI companies looking to empower their LLM applications with web data.\\n\\nWhat sites work?\\n\\nFirecrawl is best suited for business websites, docs and help centers. We currently don't support social media platforms.\\n\\nWho can benefit from using Firecrawl?\\n\\nFirecrawl is tailored for LLM engineers, data scientists, AI researchers, and developers looking to harness web data for training machine learning models, market research, content aggregation, and more. It simplifies the data preparation process, allowing professionals to focus on insights and model development.\\n\\nIs Firecrawl open-source?\\n\\nYes, it is. You can check out the repository on GitHub. Keep in mind that this repository is currently in its early stages of development. We are in the process of merging custom modules into this mono repository.\\n\\nWhat is the difference between Firecrawl and other web scrapers?\\n\\nFirecrawl is designed with reliability and AI-ready data in mind. We focus on delivering data reliably and in a LLM-ready format - so you can spend less tokens and build better AI applications.\\n\\nWhat is the difference between the open-source version and the hosted version?\\n\\nFirecrawl's hosted version features Fire-engine which is our proprietary scraper that takes care of proxies, anti-bot mechanisms and more. It is an intelligent scraper designed to get the data you need - reliably. The hosted version also allows for actions (interacting with the page before scraping), a dashboard for analytics, and it is 1 API call away.\\n\\n#### Scraping & Crawling\\n\\nHow does Firecrawl handle dynamic content on websites?\\n\\nUnlike traditional web scrapers, Firecrawl is equipped to handle dynamic content rendered with JavaScript. It ensures comprehensive data collection from all accessible subpages, making it a reliable tool for scraping websites that rely heavily on JS for content delivery.\\n\\nWhy is it not crawling all the pages?\\n\\nThere are a few reasons why Firecrawl may not be able to crawl all the pages of a website. Some common reasons include rate limiting, and anti-scraping mechanisms, disallowing the crawler from accessing certain pages. If you're experiencing issues with the crawler, please reach out to our support team at help@firecrawl.com.\\n\\nCan Firecrawl crawl websites without a sitemap?\\n\\nYes, Firecrawl can access and crawl all accessible subpages of a website, even in the absence of a sitemap. This feature enables users to gather data from a wide array of web sources with minimal setup.\\n\\nWhat formats can Firecrawl convert web data into?\\n\\nFirecrawl specializes in converting web data into clean, well-formatted markdown. This format is particularly suited for LLM applications, offering a structured yet flexible way to represent web content.\\n\\nHow does Firecrawl ensure the cleanliness of the data?\\n\\nFirecrawl employs advanced algorithms to clean and structure the scraped data, removing unnecessary elements and formatting the content into readable markdown. This process ensures that the data is ready for use in LLM applications without further preprocessing.\\n\\nIs Firecrawl suitable for large-scale data scraping projects?\\n\\nAbsolutely. Firecrawl offers various pricing plans, including a Scale plan that supports scraping of millions of pages. With features like caching and scheduled syncs, it's designed to efficiently handle large-scale data scraping and continuous updates, making it ideal for enterprises and large projects.\\n\\nDoes it respect robots.txt?\\n\\nYes, Firecrawl crawler respects the rules set in a website's robots.txt file. If you notice any issues with the way Firecrawl interacts with your website, you can adjust the robots.txt file to control the crawler's behavior. Firecrawl user agent name is 'FirecrawlAgent'. If you notice any behavior that is not expected, please let us know at help@firecrawl.com.\\n\\nWhat measures does Firecrawl take to handle web scraping challenges like rate limits and caching?\\n\\nFirecrawl is built to navigate common web scraping challenges, including stealth proxies, rate limits, and smart wait. It smartly manages requests and employs techniques to minimize bandwidth usage and avoid triggering anti-scraping mechanisms, ensuring reliable data collection.\\n\\nDoes Firecrawl handle captcha or authentication?\\n\\nFirecrawl avoids captcha by using stealth proxies. When it encounters captcha, it attempts to solve it automatically, but this is not always possible. We are working to add support for more captcha solving methods. Firecrawl can handle authentication by providing auth headers to the API.\\n\\n#### API Related\\n\\nWhere can I find my API key?\\n\\nClick on the dashboard button on the top navigation menu when logged in and you will find your API key in the main screen and under API Keys.\\n\\n#### Billing\\n\\nIs Firecrawl free?\\n\\nFirecrawl is free for the first 500 scraped pages (500 free credits). After that, you can upgrade to our Standard or Growth plans for more credits and higher rate limits.\\n\\nIs there a pay per use plan instead of monthly?\\n\\nWe currently do notoffer a pay per use plan, instead you can upgrade to our Standard or Growth plans for more credits and higher rate limits.\\n\\nHow many credit does scraping, crawling, and extraction cost?\\n\\nScraping costs 1 credit per page. Crawling costs 1 credit per page. Check out the credits table in the pricing page for more details.\\n\\nDo you charge for failed requests (scrape, crawl, extract)?\\n\\nWe do not charge for any failed requests (scrape, crawl, extract). Please contact support at help@firecrawl.com if you have notice something wrong.\\n\\nWhat payment methods do you accept?\\n\\nWe accept payments through Stripe which accepts most major credit cards, debit cards, and PayPal.\",\"metadata\":{\"title\":\"Home - Firecrawl\",\"description\":\"Firecrawl crawls and converts any website into clean markdown.\",\"language\":\"en\",\"keywords\":\"Firecrawl,Markdown,Data,Mendable,Langchain\",\"robots\":\"follow, index\",\"ogTitle\":\"Firecrawl\",\"ogDescription\":\"Turn any website into LLM-ready data.\",\"ogUrl\":\"https:\/\/www.firecrawl.dev\/\",\"ogImage\":\"https:\/\/www.firecrawl.dev\/og.png?123\",\"ogLocaleAlternate\":[],\"ogSiteName\":\"Firecrawl\",\"viewport\":\"width=device-width, initial-scale=1\",\"author\":\"Firecrawl\",\"referrer\":\"origin-when-cross-origin\",\"creator\":\"Firecrawl\",\"publisher\":\"Firecrawl\",\"og:title\":\"Firecrawl\",\"og:description\":\"Turn any website into LLM-ready data.\",\"og:url\":\"https:\/\/www.firecrawl.dev\/\",\"og:site_name\":\"Firecrawl\",\"og:image\":\"https:\/\/www.firecrawl.dev\/og.png?123\",\"og:type\":\"website\",\"twitter:card\":\"summary_large_image\",\"twitter:site\":\"@vercel\",\"twitter:title\":\"Home - Firecrawl\",\"twitter:description\":\"Firecrawl crawls and converts any website into clean markdown.\",\"twitter:image\":\"https:\/\/www.firecrawl.dev\/og.png?123\",\"sourceURL\":\"https:\/\/www.firecrawl.dev\/\",\"sitemap\":{\"changefreq\":\"weekly\",\"lastmod\":\"2024-10-21T22:48:19.591Z\"},\"statusCode\":200}}}" } diff --git a/tests/Fixtures/Saloon/Tools/FirecrawlTool-ab05a60a52727034e24aa4e6cf67e965.json b/tests/Fixtures/Saloon/Tools/FirecrawlTool-ab05a60a52727034e24aa4e6cf67e965.json deleted file mode 100644 index 9e6c062..0000000 --- a/tests/Fixtures/Saloon/Tools/FirecrawlTool-ab05a60a52727034e24aa4e6cf67e965.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:29:19 GMT", - "Content-Type": "application/json", - "Content-Length": "1243", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "3743", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999501", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "14ms", - "x-request-id": "req_6c49e6f9afc19e947109dfc9ef9ce202", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=nOMULEv5yuI9xFkS7CdqwA5I2RT1MMrui697RxR7lWY-1729560559-1.0.1.1-NXx07yOPtkm_wBncy6piWMBpcgvkwy91py7vKafSkCI_q1_gUkDtFCM43IPnJRPsPmZqGnbt0zUW3mTjLMw_tQ; path=/; expires=Tue, 22-Oct-24 01:59:19 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=nB4vf77ERmsCEGV.YXAeeJg8hzi4jzIRjmwLmxIeJt4-1729560559792-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b722892b1982-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKxzwFiarb6UIp1MHNP6ix6pjESmk\",\n \"object\": \"chat.completion\",\n \"created\": 1729560556,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"The website 'https://www.firecrawl.dev/' is about Firecrawl, a web scraping tool designed for extracting, cleaning, and converting web data into formats suitable for AI applications, particularly Large Language Models (LLMs). It offers features like crawling web subpages without needing a sitemap, handling JavaScript-rendered content, and providing clean markdown or structured data for AI training. The target audience includes LLM engineers, data scientists, and AI researchers. Firecrawl is open-source and offers various pricing plans to accommodate different user needs.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 497,\n \"completion_tokens\": 118,\n \"total_tokens\": 615,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Tools/FirecrawlToolTest.php b/tests/Tools/FirecrawlToolTest.php index 2a59c9e..f8ffd19 100644 --- a/tests/Tools/FirecrawlToolTest.php +++ b/tests/Tools/FirecrawlToolTest.php @@ -1,83 +1,83 @@ 'answer', - 'rules' => 'required|string', - 'description' => 'your final answer to the query.', - ]), - ]; - } - - protected function resolveTools(): array - { - return [new FirecrawlTool]; - } + return new OpenAIIntegration; } - MockClient::global([ - ChatRequest::class => function (PendingRequest $pendingRequest): Fixture { - $hash = md5(json_encode($pendingRequest->body()->get('messages'))); + public function resolveMemory(): Memory + { + return new CollectionMemory; + } + + public function resolveOutputSchema(): array + { + return [ + SchemaRule::make([ + 'name' => 'answer', + 'rules' => 'required|string', + 'description' => 'your final answer to the query.', + ]), + ]; + } + + protected function resolveTools(): array + { + return [new FirecrawlTool]; + } + } + + MockClient::global([ + ChatRequest::class => function (PendingRequest $pendingRequest): Fixture { + $hash = md5(json_encode($pendingRequest->body()->get('messages'))); - return MockResponse::fixture("Tools/FirecrawlTool-{$hash}"); - }, - FirecrawlRequest::class => MockResponse::fixture('Tools/FirecrawlTool-Tool'), - ]); + return MockResponse::fixture("Tools/FirecrawlTool-{$hash}"); + }, + FirecrawlRequest::class => MockResponse::fixture('Tools/FirecrawlTool-Tool'), + ]); - $agent = new FirecrawlToolTestAgent; - $message = $agent->handle(['input' => 'what is the `https://www.firecrawl.dev/` page about?']); + $agent = new FirecrawlToolTestAgent; + $message = $agent->handle(['input' => 'what is the `https://www.firecrawl.dev/` page about?']); - $agentResponseArray = $message->toArray(); - expect($agentResponseArray['content'])->toBeArray() - ->and($agentResponseArray['content'])->toHaveKey('answer') - ->and($agentResponseArray['content']['answer'])->toContain("The website 'https://www.firecrawl.dev/' is about Firecrawl, a web scraping tool designed for extracting, cleaning, and converting web data into formats suitable for AI applications, particularly Large Language Models (LLMs)."); + $agentResponseArray = $message->toArray(); + expect($agentResponseArray['content'])->toBeArray() + ->and($agentResponseArray['content'])->toHaveKey('answer') + ->and($agentResponseArray['content']['answer'])->toContain("The 'https://www.firecrawl.dev/' page is about Firecrawl, a service that allows users to crawl and scrape data from websites, transforming it into clean, structured markdown or data that is ready for LLM (Large Language Models) applications. It provides various features including handling dynamic content, rotating proxies, and scraping without needing a sitemap. Firecrawl offers different pricing plans, is open source, and aims to power AI applications by providing reliable, clean data extracted from any website."); - }); +}); - test('Architecture', function (): void { +test('Architecture', function (): void { - expect(FirecrawlTool::class) - ->toExtend(BaseTool::class) - ->toImplement(Tool::class); + expect(FirecrawlTool::class) + ->toExtend(BaseTool::class) + ->toImplement(Tool::class); - }); +}); From b2ba6e7ed6de2eb89a870174cfcf226985738a76 Mon Sep 17 00:00:00 2001 From: use-the-fork Date: Wed, 23 Oct 2024 21:38:11 -0400 Subject: [PATCH 3/7] =?UTF-8?q?chore(tests):=20remove=20obsolete=20RatAgen?= =?UTF-8?q?tChain=20fixture=20files=20=F0=9F=97=91=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Deleted multiple obsolete fixture files under `tests/Fixtures/Saloon/AgentChains/`. - Cleaned up unnecessary test data and improved project organization. --- docs/tools/index.md | 9 +-- docs/tools/packaged-tools.md | 7 +- .../Prompts/Rat/GetQueryPrompt.blade.php | 13 +++- .../Prompts/Rat/ReflectAnswerPrompt.blade.php | 16 ++++ .../Prompts/Rat/ReviseAnswerPrompt.blade.php | 25 ++++++ src/AgentChain.php | 58 +------------- src/AgentChains/RatAgentChain.php | 78 +++++++++++++++++++ src/Agents/Rat/ReflectAnswerAgent.php | 27 +++++++ src/Agents/Rat/ReviseAnswerAgent.php | 27 +++++++ src/Contracts/Tool/SearchTool.php | 7 +- src/Tools/Search/SerpAPIGoogleNewsTool.php | 12 +-- src/Tools/Search/SerpAPIGoogleSearchTool.php | 11 +-- src/Tools/Search/SerperTool.php | 31 ++++---- tests/AgentChains/RatAgentChainTest.php | 42 +++++----- ...hain-1490b8772b2bf708d3727e1fd1e12414.json | 10 +++ ...hain-2a0fcbb75e327652be2126fa648bd3e7.json | 10 +++ ...hain-47261d97210e865ca4818128f63d6926.json | 10 +++ ...hain-475d90e301668292a051dde550aee5a3.json | 11 +++ ...hain-72d3babdd785f7230e988f2e032f473d.json | 10 +++ ...hain-bc0c986806c46d9aa119053ac316b3ce.json | 10 +++ ...hain-d5c8e692581754f3aac57899f4c2603f.json | 10 +++ ...hain-ebe56fdb70a6f5dc2640a5e4b73366bc.json | 10 +++ ...hain-f709b10afe10f8e52425993b58e251a0.json | 10 +++ ...hain-ff5f3fc0f8a597f498ab55b7f934f5f1.json | 10 +++ ...Tool-073fd35020257fc589393e63f7775273.json | 8 ++ ...Tool-7b2933b3fa7351d076f3f06764a92c50.json | 8 ++ ...Tool-a08c0ae23dd3be2864787728bf4e74c4.json | 8 ++ ...Tool-566ab17bb6275aec1c9b3987dfebd126.json | 9 +++ ...Tool-6569dc605a724876f77e71cee5a3192d.json | 8 ++ ...Tool-c94f9a735104da2fd9c0c44ea1ed1ba1.json | 8 ++ ...Tool-d4bf31054d2e78fbc5e45673b16c9a89.json | 8 ++ ...hain-0dac52efdcd81f0dae4be83cc7dd9134.json | 10 --- ...hain-23b86031e4743be2f58c64dd85d11f40.json | 31 -------- ...hain-3a4abc7b397c195a952d147f5999c932.json | 31 -------- ...hain-3d6768be2549ac5e1a0e44d2ed1eb2c1.json | 31 -------- ...hain-7e62e7ca508c58a7dd52e9451a68d9b2.json | 31 -------- ...hain-9ce86b41e54066cf052469d1d46c848d.json | 10 --- ...hain-c8b871f5b66ceee6cdd6a4f41ca4809e.json | 10 --- ...hain-e6be3b2a969ae75116175e3c039cc2f2.json | 11 --- ...gent-9ae29f2ff260a200c78e895234990b88.json | 10 +++ ...gent-c31fbf2a429a96687e99c3b94fd406f3.json | 9 +++ ...gent-dd3c1226bcfb52db4cac0fc3cd00f4f0.json | 9 +++ ...gent-75c161b01e340522e8715d4c26443fa9.json | 10 +++ ...gent-f7bf86866f50c4d6aa1c3352ff0b6f8c.json | 10 +++ tests/Integrations/ClaudeIntegrationTest.php | 36 ++++----- tests/Integrations/OllamaIntegrationTest.php | 32 ++++---- tests/Integrations/OpenAiIntegrationTest.php | 34 ++++---- 47 files changed, 488 insertions(+), 348 deletions(-) create mode 100644 resources/views/Prompts/Rat/ReflectAnswerPrompt.blade.php create mode 100644 resources/views/Prompts/Rat/ReviseAnswerPrompt.blade.php create mode 100644 src/AgentChains/RatAgentChain.php create mode 100644 src/Agents/Rat/ReflectAnswerAgent.php create mode 100644 src/Agents/Rat/ReviseAnswerAgent.php create mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-1490b8772b2bf708d3727e1fd1e12414.json create mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-2a0fcbb75e327652be2126fa648bd3e7.json create mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-47261d97210e865ca4818128f63d6926.json create mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-475d90e301668292a051dde550aee5a3.json create mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-72d3babdd785f7230e988f2e032f473d.json create mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-bc0c986806c46d9aa119053ac316b3ce.json create mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-d5c8e692581754f3aac57899f4c2603f.json create mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-ebe56fdb70a6f5dc2640a5e4b73366bc.json create mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-f709b10afe10f8e52425993b58e251a0.json create mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-ff5f3fc0f8a597f498ab55b7f934f5f1.json create mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainFirecrawlTool-073fd35020257fc589393e63f7775273.json create mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainFirecrawlTool-7b2933b3fa7351d076f3f06764a92c50.json create mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainFirecrawlTool-a08c0ae23dd3be2864787728bf4e74c4.json create mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-566ab17bb6275aec1c9b3987dfebd126.json create mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-6569dc605a724876f77e71cee5a3192d.json create mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-c94f9a735104da2fd9c0c44ea1ed1ba1.json create mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-d4bf31054d2e78fbc5e45673b16c9a89.json delete mode 100644 tests/Fixtures/Saloon/AgentChains/RatAgentChain-0dac52efdcd81f0dae4be83cc7dd9134.json delete mode 100644 tests/Fixtures/Saloon/AgentChains/RatAgentChain-23b86031e4743be2f58c64dd85d11f40.json delete mode 100644 tests/Fixtures/Saloon/AgentChains/RatAgentChain-3a4abc7b397c195a952d147f5999c932.json delete mode 100644 tests/Fixtures/Saloon/AgentChains/RatAgentChain-3d6768be2549ac5e1a0e44d2ed1eb2c1.json delete mode 100644 tests/Fixtures/Saloon/AgentChains/RatAgentChain-7e62e7ca508c58a7dd52e9451a68d9b2.json delete mode 100644 tests/Fixtures/Saloon/AgentChains/RatAgentChain-9ce86b41e54066cf052469d1d46c848d.json delete mode 100644 tests/Fixtures/Saloon/AgentChains/RatAgentChain-c8b871f5b66ceee6cdd6a4f41ca4809e.json delete mode 100644 tests/Fixtures/Saloon/AgentChains/RatAgentChain-e6be3b2a969ae75116175e3c039cc2f2.json create mode 100644 tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-9ae29f2ff260a200c78e895234990b88.json create mode 100644 tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-c31fbf2a429a96687e99c3b94fd406f3.json create mode 100644 tests/Fixtures/Saloon/Integrations/OllamaToolTestAgent-dd3c1226bcfb52db4cac0fc3cd00f4f0.json create mode 100644 tests/Fixtures/Saloon/Integrations/OpenAiToolTestAgent-75c161b01e340522e8715d4c26443fa9.json create mode 100644 tests/Fixtures/Saloon/Tools/SerperTestAgent-f7bf86866f50c4d6aa1c3352ff0b6f8c.json diff --git a/docs/tools/index.md b/docs/tools/index.md index 06c6dbc..5aeba67 100644 --- a/docs/tools/index.md +++ b/docs/tools/index.md @@ -5,14 +5,7 @@ Tools allow your agent to interact with your application or external APIs. Essen Tools are inherently part of all agents, but they are not invoked unless the `resolveTools` method returns an array of tools that the agent can use. Below is an example where the `SerperTool` is added to an agent, allowing it to perform Google searches. ```php -use UseTheFork\Synapse\Agent; -use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; -use UseTheFork\Synapse\Contracts\Integration; -use UseTheFork\Synapse\Contracts\Tool; -use UseTheFork\Synapse\Integrations\OpenAIIntegration; -use UseTheFork\Synapse\Tools\SerperTool; -use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; -use UseTheFork\Synapse\ValueObject\SchemaRule; +use UseTheFork\Synapse\Agent;use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema;use UseTheFork\Synapse\Contracts\Integration;use UseTheFork\Synapse\Integrations\OpenAIIntegration;use UseTheFork\Synapse\Tools\Search\SerperTool;use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema;use UseTheFork\Synapse\ValueObject\SchemaRule; class SerperAgent extends Agent implements HasOutputSchema { diff --git a/docs/tools/packaged-tools.md b/docs/tools/packaged-tools.md index 7ca6886..b5fc649 100644 --- a/docs/tools/packaged-tools.md +++ b/docs/tools/packaged-tools.md @@ -16,7 +16,7 @@ SERPER_API_KEY= Then, include the `SerperTool` in your agent: ```php -use UseTheFork\Synapse\Tools\SerperTool; +use UseTheFork\Synapse\Tools\Search\SerperTool; protected function resolveTools(): array { @@ -38,8 +38,7 @@ SERPAPI_API_KEY= Then, include either the `SerpAPIGoogleSearchTool` or the `SerpAPIGoogleNewsTool` in your agent: ```php -use UseTheFork\Synapse\Tools\SerpAPIGoogleNewsTool; -use UseTheFork\Synapse\Tools\SerpAPIGoogleSearchTool; +use UseTheFork\Synapse\Tools\Search\SerpAPIGoogleNewsTool;use UseTheFork\Synapse\Tools\Search\SerpAPIGoogleSearchTool; protected function resolveTools(): array { @@ -64,7 +63,7 @@ FIRECRAWL_API_KEY= Then, include the `FirecrawlTool` in your agent: ```php -use UseTheFork\Synapse\Tools\FirecrawlTool; +use UseTheFork\Synapse\Tools\Scrape\FirecrawlTool; protected function resolveTools(): array { diff --git a/resources/views/Prompts/Rat/GetQueryPrompt.blade.php b/resources/views/Prompts/Rat/GetQueryPrompt.blade.php index 4e19d4d..61b8970 100644 --- a/resources/views/Prompts/Rat/GetQueryPrompt.blade.php +++ b/resources/views/Prompts/Rat/GetQueryPrompt.blade.php @@ -1,11 +1,16 @@ -## User input: {{ $question }} +### Question: {{ $question }} -## Response +### Content {{ $answer }} -## Instruction -Summarize the content with a focus on the last sentences to create a concise search query for Bing. Use search syntax to make the query specific and relevant for content verification. +### Instruction +I want to verify the content correctness of the given question, especially the last sentences. +Please summarize the content with the corresponding question. +This summarization will be used as a query to search with Bing search engine. +The query should be short but need to be specific to promise Bing can find related knowledge or pages. +You can also use search syntax to make the query short and clear enough for the search engine to find relevant language data. +Try to make the query as relevant as possible to the last few sentences in the content. @include('synapse::Parts.OutputSchema') diff --git a/resources/views/Prompts/Rat/ReflectAnswerPrompt.blade.php b/resources/views/Prompts/Rat/ReflectAnswerPrompt.blade.php new file mode 100644 index 0000000..281c321 --- /dev/null +++ b/resources/views/Prompts/Rat/ReflectAnswerPrompt.blade.php @@ -0,0 +1,16 @@ + + ### Question: {{ $question }} + + ### Answer: + {{ $answer }} + + ### Instruction + Give a title for the answer of the question. + And add a subtitle to each paragraph in the answer and output the final answer using markdown format. + This will make the answer to this question look more structured for better understanding. + + **IMPORTANT** + Try to keep the structure (multiple paragraphs with its subtitles) in the response and make it more structural for understanding. + + @include('synapse::Parts.OutputSchema') + diff --git a/resources/views/Prompts/Rat/ReviseAnswerPrompt.blade.php b/resources/views/Prompts/Rat/ReviseAnswerPrompt.blade.php new file mode 100644 index 0000000..c6253b6 --- /dev/null +++ b/resources/views/Prompts/Rat/ReviseAnswerPrompt.blade.php @@ -0,0 +1,25 @@ + + ### Existing Text in Wiki Web: + ``` + {{ $content }} + ``` + + ### Question: {{ $question }} + + ### Answer: + {{ $answer }} + + ### Instruction + I want to revise the answer according to retrieved related text of the question in WIKI pages. + You need to check whether the answer is correct. + If you find some errors in the answer, revise the answer to make it better. + If you find some necessary details are ignored, add it to make the answer more plausible according to the related text. + If you find the answer is right and do not need to add more details, just output the original answer directly. + + **IMPORTANT** + Try to keep the structure (multiple paragraphs with its subtitles) in the revised answer and make it more structural for understanding. + Add more details from retrieved text to the answer. + Split the paragraphs with \n\n characters. + + @include('synapse::Parts.OutputSchema') + diff --git a/src/AgentChain.php b/src/AgentChain.php index d08a373..785daf7 100644 --- a/src/AgentChain.php +++ b/src/AgentChain.php @@ -4,40 +4,10 @@ namespace UseTheFork\Synapse; - use UseTheFork\Synapse\AgentTask\PendingAgentChain; - use UseTheFork\Synapse\Traits\HasConfig; - use UseTheFork\Synapse\Traits\Makeable; use UseTheFork\Synapse\ValueObject\Message; - class AgentChain + abstract class AgentChain { - use Makeable; - use HasConfig; - - protected PendingAgentChain $pendingAgentChain; - protected $pipeline; - - public function __construct(array $agents) - { - foreach ($agents as $agent) { - if(! ($agent instanceof Agent)){ - throw new \Exception("Agent must be an instance of Agent"); - } - } - - $this->config()->add('persistInputs', []); - $this->config()->add('agents', collect($agents)); - $this->pendingAgentChain = $this->createPendingAgentChain(); - - } - - /** - * Create a new PendingAgentTask - */ - public function createPendingAgentChain(): PendingAgentChain - { - return new PendingAgentChain($this); - } /** * Handles the user input and extra agent arguments to retrieve the response. @@ -48,29 +18,5 @@ public function createPendingAgentChain(): PendingAgentChain * * @throws Throwable */ - public function handle(?array $input): Message - { - $this->config()->add('input', $input); - $this->config()->get('agents')->each(function ($agent) use ($input) { - $input = [ - ...$this->config()->get('input'), - ...$this->config()->get('persistInputs') - ]; - $response = $agent->handle($input); - $this->config()->add('input', $response->content()); - }); - - return Message::make([ - 'role' => 'agent', - 'finish_reason' => 'stop', - 'content' => $this->config()->get('input') - ]); - } - - public function persistInputs(array $inputs): static - { - $this->config()->add('persistInputs', $inputs); - - return $this; - } + abstract public function handle(?array $input, ?array $extraAgentArgs): Message; } diff --git a/src/AgentChains/RatAgentChain.php b/src/AgentChains/RatAgentChain.php new file mode 100644 index 0000000..88436ec --- /dev/null +++ b/src/AgentChains/RatAgentChain.php @@ -0,0 +1,78 @@ +searchTool = $searchTool; + $this->scrapeTool = $scrapeTool; + } + + public function handle(?array $input, ?array $extraAgentArgs = []): Message + { + + $ratDraftAgent = new RatDraftAgent; + $result = $ratDraftAgent->handle($input); + + $ratSplitAnswerAgent = new RatSplitAnswerAgent; + $result = $ratSplitAnswerAgent->handle([ + ...$input, + ...$result->content() + ]); + + $answer = str(''); + foreach ($result->content()['paragraphs'] as $value) { + + $answer = $answer->append("\n\n", $value); + + $getQueryAgent = new GetQueryAgent; + $result = $getQueryAgent->handle([ + ...$input, + 'answer' => $answer->toString() + ]); + + $searchResult = $this->searchTool->handle($result->content()['query']); + $searchResult = json_decode($searchResult, true); + + # Get the first Result scrape page and enhance + if(!empty($searchResult[0])){ + $scrapeResult = $this->scrapeTool->handle($searchResult[0]['link']); + + $getQueryAgent = new ReviseAnswerAgent; + $result = $getQueryAgent->handle([ + ...$input, + 'content' => $scrapeResult, + 'answer' => $answer->toString() + ]); + $answer = str($result->content()['answer']); + } + + } + + $reflectAnswerAgent = new ReflectAnswerAgent; + return $reflectAnswerAgent->handle([ + ...$input, + 'answer' => $answer->toString() + ]); + } + } diff --git a/src/Agents/Rat/ReflectAnswerAgent.php b/src/Agents/Rat/ReflectAnswerAgent.php new file mode 100644 index 0000000..d38f6a1 --- /dev/null +++ b/src/Agents/Rat/ReflectAnswerAgent.php @@ -0,0 +1,27 @@ + 'answer', + 'rules' => 'required|string', + 'description' => 'Your answer.', + ]), + ]; + } +} diff --git a/src/Agents/Rat/ReviseAnswerAgent.php b/src/Agents/Rat/ReviseAnswerAgent.php new file mode 100644 index 0000000..72e4b61 --- /dev/null +++ b/src/Agents/Rat/ReviseAnswerAgent.php @@ -0,0 +1,27 @@ + 'answer', + 'rules' => 'required|string', + 'description' => 'Your answer.', + ]), + ]; + } +} diff --git a/src/Contracts/Tool/SearchTool.php b/src/Contracts/Tool/SearchTool.php index 5a1a520..3969bce 100644 --- a/src/Contracts/Tool/SearchTool.php +++ b/src/Contracts/Tool/SearchTool.php @@ -4,14 +4,11 @@ namespace UseTheFork\Synapse\Contracts\Tool; -use UseTheFork\Synapse\Enums\ReturnType; - interface SearchTool { public function handle( string $query, ?string $searchType = 'search', - ?int $numberOfResults = 10, - ReturnType $returnType = ReturnType::STRING, - ): string|array; + ?int $numberOfResults = 10 + ): string; } diff --git a/src/Tools/Search/SerpAPIGoogleNewsTool.php b/src/Tools/Search/SerpAPIGoogleNewsTool.php index ff19c91..6370ab4 100644 --- a/src/Tools/Search/SerpAPIGoogleNewsTool.php +++ b/src/Tools/Search/SerpAPIGoogleNewsTool.php @@ -7,7 +7,6 @@ use Illuminate\Support\Arr; use UseTheFork\Synapse\Contracts\Tool; use UseTheFork\Synapse\Contracts\Tool\SearchTool; -use UseTheFork\Synapse\Enums\ReturnType; use UseTheFork\Synapse\Exceptions\MissingApiKeyException; use UseTheFork\Synapse\Services\SerpApi\Requests\SerpApiSearchRequest; use UseTheFork\Synapse\Services\SerpApi\SerpApiConnector; @@ -34,19 +33,14 @@ public function __construct() public function handle( string $query, ?string $searchType = 'search', - ?int $numberOfResults = 10, - ?ReturnType $returnType = ReturnType::STRING, - ): string|array { + ?int $numberOfResults = 10 + ): string { $serpApiConnector = new SerpApiConnector($this->apiKey); $serpApiSearchRequest = new SerpApiSearchRequest($query, 0, 'google_news'); $results = $serpApiConnector->send($serpApiSearchRequest)->array(); - - return match ($returnType) { - ReturnType::STRING => $this->parseResults($results), - default => $results - }; + return $this->parseResults($results); } private function parseResults(array $results): string diff --git a/src/Tools/Search/SerpAPIGoogleSearchTool.php b/src/Tools/Search/SerpAPIGoogleSearchTool.php index 86d5e6f..b4e4ece 100644 --- a/src/Tools/Search/SerpAPIGoogleSearchTool.php +++ b/src/Tools/Search/SerpAPIGoogleSearchTool.php @@ -8,7 +8,6 @@ use Illuminate\Support\Str; use UseTheFork\Synapse\Contracts\Tool; use UseTheFork\Synapse\Contracts\Tool\SearchTool; -use UseTheFork\Synapse\Enums\ReturnType; use UseTheFork\Synapse\Exceptions\MissingApiKeyException; use UseTheFork\Synapse\Services\SerpApi\Requests\SerpApiSearchRequest; use UseTheFork\Synapse\Services\SerpApi\SerpApiConnector; @@ -36,19 +35,15 @@ public function __construct() public function handle( string $query, ?string $searchType = 'search', - ?int $numberOfResults = 10, - ReturnType $returnType = ReturnType::STRING, - ): string|array { + ?int $numberOfResults = 10 + ): string { $serpApiConnector = new SerpApiConnector($this->apiKey); $serpApiSearchRequest = new SerpApiSearchRequest($query, $numberOfResults); $results = $serpApiConnector->send($serpApiSearchRequest)->array(); - return match ($returnType) { - ReturnType::STRING => $this->parseResults($results), - default => $results - }; + return $this->parseResults($results); } private function parseResults(array $results): string diff --git a/src/Tools/Search/SerperTool.php b/src/Tools/Search/SerperTool.php index 8c0999d..4e374ea 100644 --- a/src/Tools/Search/SerperTool.php +++ b/src/Tools/Search/SerperTool.php @@ -8,7 +8,6 @@ use Saloon\Exceptions\Request\FatalRequestException; use Saloon\Exceptions\Request\RequestException; use UseTheFork\Synapse\Contracts\Tool\SearchTool; -use UseTheFork\Synapse\Enums\ReturnType; use UseTheFork\Synapse\Exceptions\MissingApiKeyException; use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; use UseTheFork\Synapse\Services\Serper\SerperConnector; @@ -22,7 +21,7 @@ public function __construct() { $this->apiKey = config('synapse.services.serper.key'); - if(empty($this->apiKey)) { + if (empty($this->apiKey)) { throw new MissingApiKeyException('API (SERPER_API_KEY) key is required.'); } } @@ -30,29 +29,24 @@ public function __construct() /** * Search Google using a query. * - * @param string $query the search query to execute. - * @param string $searchType the type of search must be one of `search`, `places`, `news`. (usually search). - * @param int $numberOfResults the number of results to return must be one of `10`, `20`, `30`, `40`, `50` (usually `10`). + * @param string $query the search query to execute. + * @param string|null $searchType the type of search must be one of `search`, `places`, `news`. (usually search). + * @param int|null $numberOfResults the number of results to return must be one of `10`, `20`, `30`, `40`, `50` (usually `10`). * - * @return string * @throws FatalRequestException * @throws RequestException */ public function handle( string $query, ?string $searchType = 'search', - ?int $numberOfResults = 10, - ReturnType $returnType = ReturnType::STRING, - ): string|array { + ?int $numberOfResults = 10 + ): string { $serperConnector = new SerperConnector($this->apiKey); $serperSearchRequest = new SerperSearchRequest($query, $searchType, $numberOfResults); $results = $serperConnector->send($serperSearchRequest)->array(); - return match ($returnType) { - ReturnType::STRING => $this->parseResults($results), - default => $results - }; + return $this->parseResults($results); } private function parseResults(array $results): string @@ -63,28 +57,29 @@ private function parseResults(array $results): string $title = Arr::get($results, 'knowledgeGraph.title'); $entityType = Arr::get($results, 'knowledgeGraph.type'); if ($entityType) { - $snippets->push("{$title}: {$entityType}"); + $snippets->push(['type' => 'Knowledge Graph title', "{$title}" => "{$entityType}"]); } $description = Arr::get($results, 'knowledgeGraph.description'); if ($description) { $snippets->push($description); + $snippets->push(['type' => 'Knowledge Graph Description', 'value' => $description]); } foreach (Arr::get($results, 'knowledgeGraph.attributes', []) as $key => $value) { - $snippets->push("{$title} {$key}: {$value}"); + $snippets->push(['type' => 'Knowledge Graph Attribute', 'title' => $title, 'key' => $key, 'value' => $value]); } } if (! empty($results['organic'])) { foreach ($results['organic'] as $value) { - $snippets->push("```text\nTitle: {$value['title']}\nLink: {$value['link']}\nSnippet: {$value['snippet']}\n```"); + $snippets->push(['type' => 'Organic', 'title' => $value['title'], 'link' => $value['link'], 'snippet' => $value['snippet']]); } } if ($snippets->isEmpty()) { - return 'No good Google Search Result was found'; + return json_encode(['title' => 'No Good Google Search Result was found', 'snippet' => '', 'link' => ''], JSON_PRETTY_PRINT); } - return $snippets->implode("\n"); + return json_encode($snippets, JSON_PRETTY_PRINT); } } diff --git a/tests/AgentChains/RatAgentChainTest.php b/tests/AgentChains/RatAgentChainTest.php index 1007064..191c149 100644 --- a/tests/AgentChains/RatAgentChainTest.php +++ b/tests/AgentChains/RatAgentChainTest.php @@ -2,42 +2,44 @@ declare(strict_types=1); +use Saloon\Http\Faking\Fixture; use Saloon\Http\Faking\MockClient; use Saloon\Http\Faking\MockResponse; use Saloon\Http\PendingRequest; -use UseTheFork\Synapse\AgentChain; -use UseTheFork\Synapse\Agents\Rat\RatDraftAgent; -use UseTheFork\Synapse\Agents\Rat\RatSplitAnswerAgent; +use UseTheFork\Synapse\AgentChains\RatAgentChain; use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; +use UseTheFork\Synapse\Services\Firecrawl\Requests\FirecrawlRequest; +use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; +use UseTheFork\Synapse\Tools\Scrape\FirecrawlTool; +use UseTheFork\Synapse\Tools\Search\SerperTool; it('executes a RAT chain', function (): void { MockClient::global([ - ChatRequest::class => function (PendingRequest $pendingRequest): \Saloon\Http\Faking\Fixture { + ChatRequest::class => function (PendingRequest $pendingRequest): Fixture { $hash = md5(json_encode($pendingRequest->body()->get('messages'))); - return MockResponse::fixture("AgentChains/RatAgentChain-{$hash}"); + return MockResponse::fixture("AgentChains/Rat/RatAgentChain-{$hash}"); }, - ]); + SerperSearchRequest::class => function (PendingRequest $pendingRequest): Fixture { + + $hash = md5(json_encode($pendingRequest->body()->all())); + + return MockResponse::fixture("AgentChains/Rat/RatAgentChainSerperTool-{$hash}"); + }, + FirecrawlRequest::class => function (PendingRequest $pendingRequest): Fixture { + $hash = md5(json_encode($pendingRequest->body()->all())); - $agentChain = AgentChain::make([ - new RatDraftAgent, - new RatSplitAnswerAgent, - ])->persistInputs([ - 'question' => 'how so I improve my heart health?', - 'number_of_paragraphs' => '5', + return MockResponse::fixture("AgentChains/Rat/RatAgentChainFirecrawlTool-{$hash}"); + }, ]); - $message = $agentChain->handle([]); + $ratAgentChain = new RatAgentChain(new SerperTool, new FirecrawlTool); + $message = $ratAgentChain->handle(['question' => 'Summarize the American Civil War according to the timeline.', 'number_of_paragraphs' => '5']); $agentResponseArray = $message->toArray(); expect($agentResponseArray['content'])->toBeArray() - ->and($agentResponseArray['content'])->toHaveKey('paragraphs') - ->and($agentResponseArray['content']['paragraphs'])->toBeArray(); - - $answer = ''; - foreach ($agentResponseArray['content']['paragraphs'] as $paragraph) { - $answer = "{$answer}\n\n{$paragraph}"; - } + ->and($agentResponseArray['content'])->toHaveKey('answer') + ->and($agentResponseArray['content']['answer'])->toContain('The American Civil War, which spanned from 1861 to 1865, '); }); diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-1490b8772b2bf708d3727e1fd1e12414.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-1490b8772b2bf708d3727e1fd1e12414.json new file mode 100644 index 0000000..bee3a0f --- /dev/null +++ b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-1490b8772b2bf708d3727e1fd1e12414.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 22 Oct 2024 23:58:48 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-ALJ3lAka26S9EVMFchmwL6ox7ddvT\",\n \"object\": \"chat.completion\",\n \"created\": 1729641517,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"paragraphs\\\": [\\n \\\"The American Civil War, fought from 1861 to 1865, was a pivotal conflict in United States history, primarily about states' rights and slavery. The war began after several Southern states seceded from the Union, forming the Confederate States of America in response to the election of Abraham Lincoln in 1860 and the growing tensions related to slavery. In 1861, the conflict officially commenced with the Confederate attack on Fort Sumter in South Carolina on April 12th. This led President Lincoln to call for 75,000 volunteers, sparking additional Southern states to secede. The key early battles included Bull Run and the Battle of Shiloh, indicating that the war would be longer and more brutal than initially anticipated.\\\",\\n \\\"By 1862, the war had expanded across multiple fronts. Key events include the introduction of the Emancipation Proclamation by President Lincoln, which declared all slaves in Confederate states to be free, turning the conflict more distinctly into a war about slavery as well as state rights. Major battles like Antietam, which remains one of the deadliest single-day battles in American history, further underscored the ferocity of the conflict.\\\",\\n \\\"The year 1863 is marked significantly by the Battle of Gettysburg and the Siege of Vicksburg. These were pivotal Union victories that significantly turned the tide of the war. The Gettysburg Address, delivered by Lincoln in November, redefined the purpose of the war and is one of the most famous speeches in American history.\\\",\\n \\\"In 1864-65, General Ulysses S. Grant led the Union forces in a series of battles that gradually crushed the Confederate resistance. Sherman's March to the Sea further devastated the South's infrastructure and economy. The war concluded with the surrender of Confederate General Robert E. Lee to Grant at Appomattox Court House on April 9, 1865. The aftermath of the war involved Reconstruction, a period of rebuilding and integrating the Southern states back into the Union, marked by significant social, economic, and legislative changes.\\\"\\n ]\\n}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 568,\n \"completion_tokens\": 432,\n \"total_tokens\": 1000,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-2a0fcbb75e327652be2126fa648bd3e7.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-2a0fcbb75e327652be2126fa648bd3e7.json new file mode 100644 index 0000000..a5ef213 --- /dev/null +++ b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-2a0fcbb75e327652be2126fa648bd3e7.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 22 Oct 2024 23:58:53 GMT", + "Content-Type": "application/json", + "Content-Length": "738", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-ALJ40egt1p5rATI4JoqpMLM7PBxaw\",\n \"object\": \"chat.completion\",\n \"created\": 1729641532,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"query\\\": \\\"American Civil War 1862 key events Emancipation Proclamation and Battle of Antietam\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 439,\n \"completion_tokens\": 28,\n \"total_tokens\": 467,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-47261d97210e865ca4818128f63d6926.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-47261d97210e865ca4818128f63d6926.json new file mode 100644 index 0000000..f379967 --- /dev/null +++ b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-47261d97210e865ca4818128f63d6926.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 22 Oct 2024 23:59:24 GMT", + "Content-Type": "application\/json", + "Content-Length": "1745", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-ALJ4Q6NNevk8phJKhiE4vUNHF8sIj\",\n \"object\": \"chat.completion\",\n \"created\": 1729641558,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"answer\\\": \\\"The American Civil War, fought from 1861 to 1865, was a defining conflict in United States history, intensively driven by issues of states' rights, and fundamentally, the institution of slavery. The eruption of war followed the 1860 election of Abraham Lincoln, leading to the secession of seven Southern slave-holding states and the establishment of the Confederate States of America. The war commenced with the Confederate attack on Fort Sumter in South Carolina on April 12, 1861, which prompted President Lincoln to call for troops, causing more states to join the Confederacy.\\\\n\\\\nAn early pivotal battle was the Battle of Gettysburg in 1863, which, occurring four months prior to Lincoln's famous Gettysburg Address, marked a turning point. The battle was one of the bloodiest, with over 45,000 men killed, injured, captured, or missing. Lincoln's Gettysburg Address, delivered at the dedication of a military cemetery there, has since been celebrated as a profound reminder of the war's higher purpose\u2014highlighting themes of human equality and the enduring value of democracy.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 4604,\n \"completion_tokens\": 238,\n \"total_tokens\": 4842,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-475d90e301668292a051dde550aee5a3.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-475d90e301668292a051dde550aee5a3.json new file mode 100644 index 0000000..bdab6cb --- /dev/null +++ b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-475d90e301668292a051dde550aee5a3.json @@ -0,0 +1,11 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 22 Oct 2024 23:59:07 GMT", + "Content-Type": "application\/json", + "Content-Length": "1980", + "Connection": "keep-alive", + "access-control-expose-headers": "X-Request-ID" + }, + "data": "{\n \"id\": \"chatcmpl-ALJ47vKbJUXDkl423CUWyfEeYdRN9\",\n \"object\": \"chat.completion\",\n \"created\": 1729641539,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"answer\\\": \\\"The American Civil War, fought from 1861 to 1865, was a pivotal conflict in United States history, primarily over the issues of states' rights, and more fundamentally, the institution of slavery. The war erupted after the election of Abraham Lincoln in 1860, leading to the secession of seven Southern slave states and the formation of the Confederate States of America. The conflict was precipitated by the Confederate attack on Fort Sumter in South Carolina on April 12, 1861, prompting President Lincoln to issue a call for troops, which led to more states joining the Confederacy.\\\\n\\\\nKey early battles included Bull Run and the Battle of Shiloh, demonstrating that the conflict would be neither quick nor easy. In 1862, the Emancipation Proclamation promised freedom to slaves in Confederate states, reframing the war as a struggle not just for union but also for human freedom. The Battle of Antietam, on September 17, 1862, marked one of the deadliest days in American military history and was significant not just militarily but for its political outcomes as well\u2014providing President Lincoln the momentum needed to issue the preliminary Emancipation Proclamation. This decree, which promised to free slaves in rebel states, changed the trajectory of the war and solidified the moral grounds of the Union cause.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 7218,\n \"completion_tokens\": 280,\n \"total_tokens\": 7498,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-72d3babdd785f7230e988f2e032f473d.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-72d3babdd785f7230e988f2e032f473d.json new file mode 100644 index 0000000..5e91bf4 --- /dev/null +++ b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-72d3babdd785f7230e988f2e032f473d.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 22 Oct 2024 23:59:09 GMT", + "Content-Type": "application/json", + "Content-Length": "724", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-ALJ4GnKkb2OOggdv6jP2hTMUmIbnz\",\n \"object\": \"chat.completion\",\n \"created\": 1729641548,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"query\\\": \\\"Significance of Gettysburg Address 1863, impact on American Civil War\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 545,\n \"completion_tokens\": 26,\n \"total_tokens\": 571,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-bc0c986806c46d9aa119053ac316b3ce.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-bc0c986806c46d9aa119053ac316b3ce.json new file mode 100644 index 0000000..745b5ac --- /dev/null +++ b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-bc0c986806c46d9aa119053ac316b3ce.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 22 Oct 2024 23:59:50 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-ALJ4oqf51aXN1zvkO1oujJ3hEVZ7g\",\n \"object\": \"chat.completion\",\n \"created\": 1729641582,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"answer\\\": \\\"### Timeline of the American Civil War\\\\n\\\\n#### Prelude to Conflict\\\\nThe American Civil War, which spanned from 1861 to 1865, was a pivotal conflict in the history of the United States largely centered around issues of slavery and states' rights. Following the election of Abraham Lincoln in 1860, disunion sentiments heightened, leading to the secession of several Southern states to form the Confederate States of America. The formal beginning of the war was marked by the Confederate bombardment of Fort Sumter on April 12, 1861, prompting Lincoln's call for troops and triggering further secessions.\\\\n\\\\n#### Turning Points and Key Battles\\\\nA crucial turning point in the conflict was the Battle of Gettysburg in July 1863, one of the bloodiest battles over three days, which ended in a significant defeat for the Confederates. This battle was later commemorated by President Lincoln's Gettysburg Address, which underscored the war's purpose of preserving a nation dedicated to the principles of equality and democracy.\\\\n\\\\n#### Conclusion and Aftermath\\\\nIn the concluding years of the war, under the leadership of General Ulysses S. Grant, the Union forces launched decisive campaigns, leading eventually to the fall of key Southern cities and the surrender of General Robert E. Lee at Appomattox Court House on April 9, 1865. The war officially concluded with further surrenders across the Confederate armies and marked a profound transformation in American society, leading into the period known as Reconstruction, aimed at re-integrating the seceded states and abolishing slavery.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 480,\n \"completion_tokens\": 344,\n \"total_tokens\": 824,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-d5c8e692581754f3aac57899f4c2603f.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-d5c8e692581754f3aac57899f4c2603f.json new file mode 100644 index 0000000..879e9c6 --- /dev/null +++ b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-d5c8e692581754f3aac57899f4c2603f.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 22 Oct 2024 23:58:37 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-ALJ3blWUIa2V98gyv5PyEKSjrbTxf\",\n \"object\": \"chat.completion\",\n \"created\": 1729641507,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"answer\\\": \\\"The American Civil War, fought from 1861 to 1865, was a pivotal conflict in United States history, primarily about states' rights and slavery. The war began after several Southern states seceded from the Union, forming the Confederate States of America in response to the election of Abraham Lincoln in 1860 and the growing tensions related to slavery.\\\\n\\\\nIn 1861, the conflict officially commenced with the Confederate attack on Fort Sumter in South Carolina on April 12th. This led President Lincoln to call for 75,000 volunteers, sparking additional Southern states to secede. The key early battles included Bull Run and the Battle of Shiloh, indicating that the war would be longer and more brutal than initially anticipated.\\\\n\\\\nBy 1862, the war had expanded across multiple fronts. Key events include the introduction of the Emancipation Proclamation by President Lincoln, which declared all slaves in Confederate states to be free, turning the conflict more distinctly into a war about slavery as well as state rights. Major battles like Antietam, which remains one of the deadliest single-day battles in American history, further underscored the ferocity of the conflict.\\\\n\\\\nThe year 1863 is marked significantly by the Battle of Gettysburg and the Siege of Vicksburg. These were pivotal Union victories that significantly turned the tide of the war. The Gettysburg Address, delivered by Lincoln in November, redefined the purpose of the war and is one of the most famous speeches in American history.\\\\n\\\\nIn 1864-65, General Ulysses S. Grant led the Union forces in a series of battles that gradually crushed the Confederate resistance. Sherman's March to the Sea further devastated the South's infrastructure and economy. The war concluded with the surrender of Confederate General Robert E. Lee to Grant at Appomattox Court House on April 9, 1865. The aftermath of the war involved Reconstruction, a period of rebuilding and integrating the Southern states back into the Union, marked by significant social, economic, and legislative changes.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 120,\n \"completion_tokens\": 430,\n \"total_tokens\": 550,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-ebe56fdb70a6f5dc2640a5e4b73366bc.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-ebe56fdb70a6f5dc2640a5e4b73366bc.json new file mode 100644 index 0000000..7d43245 --- /dev/null +++ b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-ebe56fdb70a6f5dc2640a5e4b73366bc.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 22 Oct 2024 23:59:42 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-ALJ4gmVxvqX31vwKeueb1yEcpPVqE\",\n \"object\": \"chat.completion\",\n \"created\": 1729641574,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"answer\\\": \\\"The American Civil War, which spanned from 1861 to 1865, was a pivotal conflict in the history of the United States largely centered around issues of slavery and states' rights. Following the election of Abraham Lincoln in 1860, disunion sentiments heightened, leading to the secession of several Southern states to form the Confederate States of America. The formal beginning of the war was marked by the Confederate bombardment of Fort Sumter on April 12, 1861, prompting Lincoln's call for troops and triggering further secessions.\\\\n\\\\nA crucial turning point in the conflict was the Battle of Gettysburg in July 1863, one of the bloodiest battles over three days, which ended in a significant defeat for the Confederates. This battle was later commemorated by President Lincoln's Gettysburg Address, which underscored the war's purpose of preserving a nation dedicated to the principles of equality and democracy.\\\\n\\\\nIn the concluding years of the war, under the leadership of General Ulysses S. Grant, the Union forces launched decisive campaigns, leading eventually to the fall of key Southern cities and the surrender of General Robert E. Lee at Appomattox Court House on April 9, 1865. The war officially concluded with further surrenders across the Confederate armies and marked a profound transformation in American society, leading into the period known as Reconstruction, aimed at re-integrating the seceded states and abolishing slavery.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 10459,\n \"completion_tokens\": 309,\n \"total_tokens\": 10768,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-f709b10afe10f8e52425993b58e251a0.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-f709b10afe10f8e52425993b58e251a0.json new file mode 100644 index 0000000..4b44487 --- /dev/null +++ b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-f709b10afe10f8e52425993b58e251a0.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 22 Oct 2024 23:58:50 GMT", + "Content-Type": "application\/json", + "Content-Length": "765", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-ALJ3xuMTKxEYmoZQsKpeSwsfdtAti\",\n \"object\": \"chat.completion\",\n \"created\": 1729641529,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"query\\\": \\\"\\\\\\\"American Civil War\\\\\\\" timeline 1861 \\\\\\\"Fort Sumter\\\\\\\" \\\\\\\"Bull Run\\\\\\\" \\\\\\\"Battle of Shiloh\\\\\\\" effects\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 353,\n \"completion_tokens\": 35,\n \"total_tokens\": 388,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-ff5f3fc0f8a597f498ab55b7f934f5f1.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-ff5f3fc0f8a597f498ab55b7f934f5f1.json new file mode 100644 index 0000000..56e6478 --- /dev/null +++ b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-ff5f3fc0f8a597f498ab55b7f934f5f1.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 22 Oct 2024 23:59:26 GMT", + "Content-Type": "application\/json", + "Content-Length": "866", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-ALJ4XBVUCOJP47TDmq0z20WLj7bhl\",\n \"object\": \"chat.completion\",\n \"created\": 1729641565,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"query\\\": \\\"American Civil War summary timeline, Battle of Gettysburg 1863, General Grant's leadership, Sherman's March to the Sea, Confederate General Lee's surrender at Appomattox Court House 1865, post-war Reconstruction\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 553,\n \"completion_tokens\": 56,\n \"total_tokens\": 609,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainFirecrawlTool-073fd35020257fc589393e63f7775273.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainFirecrawlTool-073fd35020257fc589393e63f7775273.json new file mode 100644 index 0000000..a87e71e --- /dev/null +++ b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainFirecrawlTool-073fd35020257fc589393e63f7775273.json @@ -0,0 +1,8 @@ +{ + "statusCode": 200, + "headers": { + "X-Powered-By": "Express", + "Access-Control-Allow-Origin": "*" + }, + "data": "{\"success\":true,\"data\":{\"markdown\":\"We use cookies to understand how you use our site, improve your experience, and personalize content. To learn more, [click here](https:\/\/www.battlefields.org\/about\/accountability\/privacy-policy#cookies)\\n. By continuing to use our site, you accept our use of cookies, [Privacy Policy](https:\/\/www.battlefields.org\/about\/accountability\/privacy-policy)\\n, and [Terms of Service](https:\/\/www.battlefields.org\/terms-service)\\n.\\n\\nI agree [More info](https:\/\/www.battlefields.org\/about\/accountability\/privacy-policy#cookies)\\n Reject cookies\\n\\n[Skip to main content](#main-content)\\n\\n[My Library](\/learn\/educators\/my-library)\\n\\n ![This is an image depicting casualties on the Antietam battlefield. ](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/hero_large\/public\/thumbnails\/image\/Antietam%20Battle%20Page%20Hero_0.jpg?h=1a7cb72a&itok=XKHEKkMd)\\n\\nAntietam\\n========\\n\\nSharpsburg\\n----------\\n\\nWatch Antietam: Animated Battle Map\\n\\nClose Video\\n\\nAlso offered in: [Espa\u00f1ol](\/learn\/civil-war\/battles\/antietam-espanol)\\n\\nWashington County, MD\u00a0\u00a0|\u00a0\u00a0Sep 17, 1862\\n--------------------------------------\\n\\nAntietam, the deadliest one-day battle in American military history, showed that the Union could stand against the Confederate army in the Eastern theater. It also gave President Abraham Lincoln the confidence to issue the preliminary Emancipation Proclamation at a moment of strength rather than desperation.\\n\\n#### **How it ended**\\n\\nInconclusive. General Robert E. Lee committed his entire force to the battle, while Maj. Gen. George B. McClellan sent in less than three quarters of his. With the full commitment of McClellan\u2019s troops, which outnumbered the Confederates two to one, the battle might have had a more definitive outcome. Instead, McClellan\u2019s half-hearted approach allowed Lee to hold ground by shifting forces from threat to threat.\\n\\n#### **In context**\\n\\nLee invaded Maryland in September 1862 with a full agenda. He wanted to move the focus of fighting away from the South and into Federal territory. Victories there, could lead to the capture of the Federal capital in Washington, D.C. Confederate success could also influence impending Congressional elections in the North and persuade European nations to recognize the Confederate States of America. On the other side, President Abraham Lincoln was counting on McClellan to bring him the victory he needed to keep Republican control of the Congress and issue a preliminary Emancipation Proclamation.\\n\\nBefore the Battle\\n\\nThe first Confederate invasion of Union-held territory is not going as planned. After a Union victory at [the Battle of South Mountain](https:\/\/www.battlefields.org\/learn\/civil-war\/battles\/south-mountain)\\n and a Confederate victory at [the Battle of Harpers Ferry](https:\/\/www.battlefields.org\/learn\/civil-war\/battles\/harpers-ferry)\\n, Confederate general Robert E. Lee opts to make one last stand in the hopes of salvaging his Maryland Campaign.\\n\\nWith Federal forces closing in from the east, Lee selects strategic ground near Antietam Creek and orders his army to converge there. A mile east of the town of Sharpsburg, the creek meanders through the hilly but open countryside, good for long-range artillery and moving infantry. The water is deep, swift, and crossable only at three stone bridges, making it a natural defensible location. On September 15, Lee positions his men behind the creek and waits for McClellan to arrive.\\n\\nOn the afternoon of September 16, Union general George B. McClellan sets his army in motion, sending Maj. Gen. Joseph Hooker\u2019s First Corps across Antietam Creek to find Lee\u2019s left flank. At dusk, Hooker bumps into Confederate general John Bell Hood\u2019s division and the two forces skirmish until dark. The following morning, McClellan attacks.\\n\\nDuring the Battle\\n\\n[![Portrait of George B. McClellan](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/General%20George%20B%20McClellan%20Square.jpg?h=d8c3850d&itok=TwTCmLat)](\/learn\/biographies\/george-b-mcclellan)\\n\\nUnion\\n\\n[George B. McClellan](\/learn\/biographies\/george-b-mcclellan)\\n\\n[![Portrait of Robert E. Lee](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/Robert%20E.%20Lee.jpg?h=d8c3850d&itok=wdGXCQTD)](\/learn\/biographies\/robert-e-lee)\\n\\nConfederate\\n\\n[Robert E. Lee](\/learn\/biographies\/robert-e-lee)\\n\\nForces Engaged\\n\\n132,000\\n\\nUnion \\n87,000\\n\\nConfed. \\n45,000\\n\\nSeptember 17. The Battle of Antietam begins at dawn when Hooker\u2019s Union corps mounts a powerful assault on Lee\u2019s left flank. Repeated Union attacks and equally vicious Confederate counterattacks sweep back and forth across Miller\u2019s cornfield and the West Woods. Hooker sees thousands of his Federals felled in the corn rows, where, \u201cevery stalk of corn in the northern and greater part of the field was cut as closely as could have been done with a knife, and the slain lay in rows precisely as they had stood in their ranks a few moments before.\u201d Despite the great Union numerical advantage, Lt. Gen. Stonewall Jackson\u2019s Confederate forces hold their ground near the Dunker Church.\\n\\nMeanwhile, towards the center of the battlefield, Union assaults against the Sunken Road pierce the Confederate center after a terrible struggle for this key defensive position. Unfortunately for the Union, this temporal advantage in the center is not followed up with further advances and eventually the Union defenders must abandon their position.\\n\\nIn the afternoon, the third and final major assault by Maj. Gen. Ambrose E. Burnside's Ninth Corps pushes over a bullet-strewn stone bridge at Antietam Creek. (Today it\u2019s called Burnside Bridge.) Just as Burnside's forces begin to collapse the Confederate right, Maj. Gen. A.P. Hill\u2019s division charges into battle after a long march from Harpers Ferry, helping drive back the assault and saving the day for the Army of Northern Virginia.\\n\\nAftermath\\n\\nUnion\\n\\n12,401\\n\\n2,108 killed\\n\\n9,540 wounded\\n\\n753 missing & captured\\n\\nEstimated Casualties\\n\\n22,717\\n\\nUnion \\n12,401\\n\\nConfed. \\n10,316\\n\\nConfederate\\n\\n10,316\\n\\n1,546 killed\\n\\n7,752 wounded\\n\\n1,018 missing & captured\\n\\nThere are more than 22,000 casualties at the Battle of Antietam. Doctors at the scene are overwhelmed. Badly needed supplies are brought in by nurse Clara Barton, known as the \u201cAngel of the Battlefield.\u201d During the night, both armies tend their wounded and consolidate their lines. In spite of his diminished ranks, Lee continues to skirmish with McClellan on September 18, while removing his wounded south of the Potomac River. Late that evening and on September 19, after realizing that no further attacks are coming from McClellan, Lee withdraws from the battlefield and slips back across the Potomac into Virginia. McClellan sends Maj. Gen. Fitz John Porter to mount a cautious pursuit, which is repulsed at [the Battle of Shepherdstown](https:\/\/www.battlefields.org\/learn\/civil-war\/battles\/shepherdstown)\\n.\\n\\nWhile the Battle of Antietam is considered a tactical draw, President Lincoln claims a strategic victory. Lincoln has been waiting for a military success to issue his preliminary [Emancipation Proclamation](https:\/\/www.battlefields.org\/learn\/articles\/10-facts-emancipation-proclamation)\\n. He takes his opportunity on September 22. The Proclamation, which vows to free the slaves of all states still in rebellion as of January 1, 1863, will forever change the course of the war and the nation by marrying the Union cause with an attack on the institution of slavery. Hesitant to support a pro-slavery regime, England and France decline to form an alliance with the Confederate States of America.\\n\\nAfter McClellan fails to pursue Lee on his retreat south, Lincoln loses faith in his general. Weeks later, he names Burnside commander of the Army of the Potomac.\\n\\nQuestions to Consider\\n\\n1\\\\. Why did Lincoln lose faith in George McClellan\u2019s command after Antietam?\\n\\nLincoln and McClellan had a tortured relationship. McClellan\u2019s letters reveal his contempt for his commander-in-chief (whom he sometimes referred to as \u201cthe Gorilla\u201d), and the historical record shows that as the war slogged on, Lincoln became increasingly frustrated with his general\u2019s timidity and excuses. He believed McClellan spent too much of his command drilling troops and little of it pursuing Lee. Lincoln called the general\u2019s \u201ccondition\u201d a bad case of \u201cthe slows.\u201d\\n\\nThough well-liked by his men, McClellan could be vain and boastful. After he failed to attack Lee\u2019s depleted troops as they fled Sharpsburg on September 18, he wrote to his wife, Ellen, that, ''those in whose judgment I rely tell me that I fought the battle splendidly & that it was a masterpiece of art.''\u00a0 Lincoln disagreed. He could not understand why his general was not on the tail of the Confederates, and he went to McClellan\u2019s headquarters at Antietam to light a fire under him. In a letter to his wife, Mary, Lincoln joked, \u201cWe are about to be photographed. . . \\\\[if\\\\] we can sit still long enough. I feel Gen. M. should have no problem.\u201d\\n\\nSix weeks after Antietam, McClellan finally heeded his boss\u2019s advice and led the Army of the Potomac into Virginia, but at a snail\u2019s pace. Even before the nine-day trek, Lincoln had all but given up on the man who had once been christened \u201cYoung Napoleon\u201d for his military promise. The president relieved McClellan of his duties on November 7 and appointed Maj. Gen. Ambrose Burnside to be his replacement.\\n\\nAfter losing his command, McClellan took up a new career\u2014politics. In the 1864 election he was the Democratic nominee for president of the United States. His opponent, Abraham Lincoln, was reelected for another term.\\n\\n2\\\\. Why is nurse Clara Barton considered a hero of Antietam?\\n\\nClarissa \u201cClara\u201d Harlowe Barton was a former teacher and patent clerk who became a nurse on the front lines during the Civil War. Despite having no prior experience and receiving no payment for her services, she bravely drove her cart of medical supplies into the fray at many battles, including Antietam. She saw the desperation of the wounded and dying and did what she could to aid and comfort them. Dr. James Dunn, a surgeon at the Battle of Antietam lauded her efforts:\\n\\nThe rattle of 150,000 muskets, and the fearful thunder of over 200 cannon, told us that the great battle of Antietam had commenced. I was in the hospital in the afternoon, for it was then only that the wounded began to come in. We had expended every bandage, tore up every sheet in the house, and everything we could find, when who should drive up but our old friend, Miss Barton, with a team loaded down with dressings of every kind, and everything we could ask for. . . .In my feeble estimation, General McClellan, with all his laurels, sinks into insignificance beside the true heroine of the age, _the angel of the battle field_.\\n\\nLater in the war, Lincoln authorized Barton to form the Office of Correspondence with Friends of Missing Men in the United States Army, an effort that eventually identified 22,000 missing Union soldiers. In 1881 Barton founded the American Red Cross.\\n\\nAntietam: Featured Resources\\n----------------------------\\n\\n[![Two trees set against a vivid purple sky at Antietam National Battlefield](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/Antietam_BuddySecor_1E2A9575-Antietam-%28Secor-2017%29-HiRez.jpg?h=89182231&itok=_LxpqldD)](\/learn\/quizzes\/how-well-do-know-battle-antietam)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Quiz](\/search?algolia_search_index[refinementList][field_resource_type][]=quiz)\\n\\n### [How Well Do Know the Battle of Antietam?](\/learn\/quizzes\/how-well-do-know-battle-antietam)\\n\\n[![Photograph of McClellan discussing business in a tent](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/ls_0.jpg?h=a4080807&itok=fhoiquCF)](\/learn\/articles\/mcclellan-antietam)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Article](\/search?algolia_search_index[refinementList][field_resource_type][]=article)\\n\\n### [McClellan at Antietam](\/learn\/articles\/mcclellan-antietam)\\n\\n[![](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/Antietam_Elliot_Map_Segment_0.jpg?h=8dd85f47&itok=Gm_KIKQI)](\/learn\/articles\/nineteenth-century-geolocation-elliott-map-antietam)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Article](\/search?algolia_search_index[refinementList][field_resource_type][]=article)\\n\\n### [Nineteenth-Century Geolocation: The Elliott Map of Antietam](\/learn\/articles\/nineteenth-century-geolocation-elliott-map-antietam)\\n\\n[![Screenshot of the Antietam animated map](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/Screen%20Shot%202017-04-04%20at%2011.53.15%20AM.png?h=ad937be1&itok=lQBmQ62R)](\/learn\/maps\/antietam-animated-map)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Video](\/search?algolia_search_index[refinementList][field_resource_type][]=video)\\n\\n### [Antietam Animated Map](\/learn\/maps\/antietam-animated-map)\\n\\n[![A portrait of Abraham Lincoln bordered by two American flags](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/Emancipation%20Proclamation%2010%20Facts.jpg?h=d86166dc&itok=4hGdn5CI)](\/learn\/articles\/10-facts-emancipation-proclamation)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Article](\/search?algolia_search_index[refinementList][field_resource_type][]=article)\\n\\n### [10 Facts: The Emancipation Proclamation](\/learn\/articles\/10-facts-emancipation-proclamation)\\n\\n[![Photograph of the train and bridge at Harper's Ferry](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/Harpers%20Ferry%20Hero.jpg?h=d86166dc&itok=XSRICoSZ)](\/learn\/civil-war\/battles\/harpers-ferry)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Battle](\/search?type[]=battle)\\n\\n### [Harpers Ferry](\/learn\/civil-war\/battles\/harpers-ferry)\\n\\n[![A distant photograph of Dunker Church at Antietam](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/Artillery%20Hell%20at%20the%20Dunker%20Church_1.jpg?h=d7680848&itok=Q2bcSAJC)](\/learn\/articles\/antietam-federal-flank-attack-dunker-church)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Article](\/search?algolia_search_index[refinementList][field_resource_type][]=article)\\n\\n### [Antietam: Federal Flank Attack at Dunker Church](\/learn\/articles\/antietam-federal-flank-attack-dunker-church)\\n\\n[![This is an image of the Antietam App icon.](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/antietam-landscape.jpg?h=a4080807&itok=GNFrqfNJ)](\/visit\/mobile-apps\/antietam-battle-app)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Mobile App](\/search?algolia_search_index[refinementList][field_resource_type][]=mobile_app)\\n\\n### [Antietam Battle App](\/visit\/mobile-apps\/antietam-battle-app)\\n\\n[![Cover of the \\\"Long Road to Antietam\\\"](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/Long-Road-To-Antietam-%28Landscape%29.jpg?h=a4080807&itok=w4jLXDfv)](\/learn\/articles\/book-long-road-antietam)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Article](\/search?algolia_search_index[refinementList][field_resource_type][]=article)\\n\\n### [Book: The Long Road to Antietam](\/learn\/articles\/book-long-road-antietam)\\n\\n[![](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/Antietam_MattBrant_DunkerChurch_FromWestWoods_BW.jpg?h=5234f34a&itok=7UqDyn0c)](\/learn\/articles\/lessons-fallen-depictions-dead-antietam)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Article](\/search?algolia_search_index[refinementList][field_resource_type][]=article)\\n\\n### [Lessons From the Fallen: Depictions of the Dead of Antietam](\/learn\/articles\/lessons-fallen-depictions-dead-antietam)\\n\\n[![](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/Antietam_Elliot_Map_Segment_0.jpg?h=8dd85f47&itok=Gm_KIKQI)](\/learn\/maps\/antietam-sg-elliott-burial-map)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Historical Map](\/search?algolia_search_index[refinementList][field_resource_type][]=history_map)\\n\\n### [Antietam - S.G. Elliott Burial Map](\/learn\/maps\/antietam-sg-elliott-burial-map)\\n\\n[![Antietam | Sunken Road | Sep 17, 1862 | 9:30 am - 1:00 pm](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/Antietam_sunken-road_930-am-to-1pm_Sept-17-1862-%28August-2023%29.jpg?h=a4e5fa57&itok=xmbHsrRt)](\/learn\/maps\/antietam-sunken-road-sep-17-1862)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Battle Map](\/search?algolia_search_index[refinementList][field_resource_type][]=battle_map)\\n\\n### [Antietam | Sunken Road | Sep 17, 1862](\/learn\/maps\/antietam-sunken-road-sep-17-1862)\\n\\n[![Antietam | Burnside's Bridge | Sep 17, 1862 | 12:00 - 1:00 pm](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/Antietam_burnside-bridge_noon-to-1pm_Sept-17-1862-%28August-2023%29.jpg?h=08d962ad&itok=aI7956JL)](\/learn\/maps\/antietam-burnsides-bridge-sep-17-1862)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Battle Map](\/search?algolia_search_index[refinementList][field_resource_type][]=battle_map)\\n\\n### [Antietam | Burnside's Bridge | Sep 17, 1862](\/learn\/maps\/antietam-burnsides-bridge-sep-17-1862)\\n\\n[![This is a sketch of Union soldiers lined up and ready for battle. ](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/default-history-troops_0.jpg?h=fc321e16&itok=Poka9YqY)](\/learn\/articles\/antietam)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Article](\/search?algolia_search_index[refinementList][field_resource_type][]=article)\\n\\n### [Antietam](\/learn\/articles\/antietam)\\n\\n[Antietam: Search All Resources](\/search?algolia_search_index[refinementList][title_2][]=Antietam)\\n\\nAll battles of the Maryland Campaign\\n------------------------------------\\n\\n1\\n\\n2\\n\\n3\\n\\n4\\n\\n5\\n\\n500 km\\n\\n300 mi\\n\\n[+](# \\\"Zoom in\\\")\\n[\u2212](# \\\"Zoom out\\\")\\n\\n[](# \\\"View Fullscreen\\\")\\n\\n[Leaflet](http:\/\/leafletjs.com \\\"A JS library for interactive maps\\\")\\n\\nClick to view and interact with the map\\n\\n[Full Civil War Map](\/learn\/battles?historical_period=71)\\n\\n1\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Battle](\/search?type[]=battle)\\n\\nHarpers Ferry\\n\\nJefferson County, WV\u00a0\u00a0|\u00a0\u00a0Sep 12\u00a0-\u00a015, 1862\\n\\n**Result:** Confederate Victory \\n**Est. Casualties:** 12,922 \\n**Union:** 12,636 \\n**Confederate:** 286 \\n\\n2\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Battle](\/search?type[]=battle)\\n\\nSouth Mountain\\n\\nFrederick County and Washington County, MD\u00a0\u00a0|\u00a0\u00a0Sep 14, 1862\\n\\n**Result:** Union Victory \\n**Est. Casualties:** 5,010 \\n**Union:** 2,325 \\n**Confederate:** 2,685 \\n\\n3\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Battle](\/search?type[]=battle)\\n\\nLa batalla de Antietam\\n\\nWashington County, MD\u00a0\u00a0|\u00a0\u00a0Sep 16\u00a0-\u00a018, 1862\\n\\n**Result:** Union Victory \\n**Est. Casualties:** 22,717 \\n**Union:** 12,401 \\n**Confederate:** 10,316 \\n\\n4\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Battle](\/search?type[]=battle)\\n\\nAntietam\\n\\nWashington County, MD\u00a0\u00a0|\u00a0\u00a0Sep 17, 1862\\n\\n**Result:** Union Victory \\n**Est. Casualties:** 22,717 \\n**Union:** 12,401 \\n**Confederate:** 10,316 \\n\\n5\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Battle](\/search?type[]=battle)\\n\\nShepherdstown\\n\\nTown of Shepherdstown, WV\u00a0\u00a0|\u00a0\u00a0Sep 19\u00a0-\u00a020, 1862\\n\\n**Result:** Confederate Victory \\n**Est. Casualties:** 622 \\n**Union:** 361 \\n**Confederate:** 261 \\n\\nAdd to My Battlefields Educators Library\\n\\nRelated Battles\\n---------------\\n\\n[Battle Facts](\/learn\/civil-war\/battles\/antietam)\\n\\nWashington County, MD | September 17, 1862\\n\\nResult: Union Victory\\n\\nCommanders\\n\\n[![Portrait of George B. McClellan](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/General%20George%20B%20McClellan%20Square.jpg?h=d8c3850d&itok=TwTCmLat)](\/learn\/biographies\/george-b-mcclellan)\\n\\nUnion\\n\\n[George B. McClellan](\/learn\/biographies\/george-b-mcclellan)\\n\\n[![Portrait of Robert E. Lee](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/Robert%20E.%20Lee.jpg?h=d8c3850d&itok=wdGXCQTD)](\/learn\/biographies\/robert-e-lee)\\n\\nConfederate\\n\\n[Robert E. Lee](\/learn\/biographies\/robert-e-lee)\\n\\nForces Engaged\\n\\n132,000\\n\\nUnion \\n87,000\\n\\nConfed. \\n45,000\\n\\nEstimated Casualties\\n\\n22,717\\n\\nUnion \\n12,401\\n\\nConfed. \\n10,316\\n\\n[![This is an image of the Antietam battlefield at sunset. ](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/Antietam%20Battlefield%20Hero.jpg?h=d86166dc&itok=BlXSTN4V)](\/visit\/battlefields\/antietam-battlefield)\\n\\n### [Visit Antietam](\/visit\/battlefields\/antietam-battlefield)\\n\\nWidely considered to be one of the most beautiful, pristine and well-preserved Civil War battlefields, Antietam is a must-see for any Civil War...\\n\\n[Details and Itineraries \u00bb](\/visit\/battlefields\/antietam-battlefield)\\n\\n[![Photograph of the stone bridge at Antietam](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/Antietam%20360%20Hero.jpg?h=d86166dc&itok=FXc7cL4N)](\/visit\/virtual-tours\/antietam-360-virtual-tour)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[360\u00b0 Virtual Tour](\/search?type[]=virtual_tour)\\n\\n### [Antietam Virtual Tour](\/visit\/virtual-tours\/antietam-360-virtual-tour)\\n\\n![](https:\/\/t.co\/i\/adsct?bci=3&eci=2&event_id=c863ea1b-7bc5-40a5-96f8-116e853271b1&events=%5B%5B%22pageview%22%2C%7B%7D%5D%5D&integration=advertiser&p_id=Twitter&p_user_id=0&pl_id=dafbb5fc-3616-4b28-8370-12d1c2c33328&tw_document_href=https%3A%2F%2Fwww.battlefields.org%2Flearn%2Fcivil-war%2Fbattles%2Fantietam&tw_iframe_status=0&tw_order_quantity=0&tw_sale_amount=0&txn_id=ny98u&type=javascript&version=2.3.30)![](https:\/\/analytics.twitter.com\/i\/adsct?bci=3&eci=2&event_id=c863ea1b-7bc5-40a5-96f8-116e853271b1&events=%5B%5B%22pageview%22%2C%7B%7D%5D%5D&integration=advertiser&p_id=Twitter&p_user_id=0&pl_id=dafbb5fc-3616-4b28-8370-12d1c2c33328&tw_document_href=https%3A%2F%2Fwww.battlefields.org%2Flearn%2Fcivil-war%2Fbattles%2Fantietam&tw_iframe_status=0&tw_order_quantity=0&tw_sale_amount=0&txn_id=ny98u&type=javascript&version=2.3.30)\\n\\n![](https:\/\/bat.bing.com\/action\/0?ti=142000833&Ver=2&mid=0df38fd2-37eb-4c27-b0f9-126134244ee7&bo=1&sid=99f5a55090d111efab6071f134391ce9&vid=99f5e7e090d111efbfccf93e7a9f88d2&vids=1&msclkid=N&pi=918639831&lg=en-US&sw=1280&sh=1024&sc=24&tl=Antietam%20Battle%20Facts%20and%20Summary%20%7C%20American%20Battlefield%20Trust&p=https%3A%2F%2Fwww.battlefields.org%2Flearn%2Fcivil-war%2Fbattles%2Fantietam&r=<=1679&evt=pageLoad&sv=1&cdb=AQAA&rn=543974)\",\"metadata\":{\"title\":\"Antietam Battle Facts and Summary | American Battlefield Trust\",\"description\":\"Battle of Antietam page - battle maps, history articles, photos, and preservation news on this important 1862 Civil War battle in Maryland.\",\"language\":\"en\",\"robots\":\"index, follow\",\"ogTitle\":\"Antietam\",\"ogDescription\":\"Battle of Antietam page - battle maps, history articles, photos, and preservation news on this important 1862 Civil War battle in Maryland.\",\"ogUrl\":\"https:\/\/www.battlefields.org\/learn\/civil-war\/battles\/antietam\",\"ogImage\":\"https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/social_media\/public\/thumbnails\/image\/Antietam%20Battlefield%20Hero.jpg?h=26133ae9&itok=S05zXtkM\",\"ogLocaleAlternate\":[],\"ogSiteName\":\"American Battlefield Trust\",\"geo.position\":\"39.473125723648;-77.74491010581\",\"geo.region\":\"US-MD\",\"og:site_name\":\"American Battlefield Trust\",\"og:type\":\"website\",\"og:url\":\"https:\/\/www.battlefields.org\/learn\/civil-war\/battles\/antietam\",\"og:title\":\"Antietam\",\"og:description\":\"Battle of Antietam page - battle maps, history articles, photos, and preservation news on this important 1862 Civil War battle in Maryland.\",\"og:image\":\"https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/social_media\/public\/thumbnails\/image\/Antietam%20Battlefield%20Hero.jpg?h=26133ae9&itok=S05zXtkM\",\"og:image:width\":\"857\",\"og:image:height\":\"450\",\"og:image:alt\":\"This is an image of the Antietam battlefield at sunset.\",\"place:location:latitude\":\"39.473125723648\",\"place:location:longitude\":\"-77.74491010581\",\"og:locality\":\"Sharpsburg\",\"og:region\":\"MD\",\"og:postal_code\":\"21782\",\"fb:pages\":\"21813808850\",\"twitter:card\":\"summary_large_image\",\"twitter:description\":\"Battle of Antietam page - battle maps, history articles, photos, and preservation news on this important 1862 Civil War battle in Maryland.\",\"twitter:site\":\"@battlefields\",\"twitter:title\":\"Antietam\",\"twitter:site:id\":\"25512685\",\"twitter:image:alt\":\"This is an image of the Antietam battlefield at sunset.\",\"viewport\":\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\",\"og:image:secure_url\":\"https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/social_media\/public\/thumbnails\/image\/Antietam%20Battlefield%20Hero.jpg?h=26133ae9&itok=S05zXtkM\",\"twitter:image\":\"https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/social_media\/public\/thumbnails\/image\/Antietam%20Battlefield%20Hero.jpg?h=26133ae9&itok=S05zXtkM\",\"sourceURL\":\"https:\/\/www.battlefields.org\/learn\/civil-war\/battles\/antietam\",\"statusCode\":200}}}" +} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainFirecrawlTool-7b2933b3fa7351d076f3f06764a92c50.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainFirecrawlTool-7b2933b3fa7351d076f3f06764a92c50.json new file mode 100644 index 0000000..7275d40 --- /dev/null +++ b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainFirecrawlTool-7b2933b3fa7351d076f3f06764a92c50.json @@ -0,0 +1,8 @@ +{ + "statusCode": 200, + "headers": { + "X-Powered-By": "Express", + "Access-Control-Allow-Origin": "*" + }, + "data": "{\"success\":true,\"data\":{\"markdown\":\"* [Skip to global NPS navigation](#GlobalNav-toggle)\\n \\n* [Skip to this park navigation](#LocalNav-desktop-nav)\\n \\n* [Skip to the main content](#main)\\n \\n* [Skip to this park information section](#ParkFooter)\\n \\n* [Skip to the footer section](#GlobalFooter)\\n \\n\\n [![](https:\/\/www.nps.gov\/theme\/assets\/dist\/images\/branding\/logo.png) National Park Service](\/)\\n [Search](#GlobalFooterSearch)\\n\\nSearch\\n\\nThis Site All NPS\\n\\n \\n\\n* [Info](\/gett\/planyourvisit\/basicinfo.htm)\\n \\n* [Alerts 1](\/gett\/planyourvisit\/conditions.htm)\\n \\n* [Maps](\/gett\/planyourvisit\/maps.htm)\\n \\n* [Calendar](\/gett\/planyourvisit\/calendar.htm)\\n \\n* [Fees](\/gett\/planyourvisit\/fees.htm)\\n \\n\\n1 alert notifications\\n\\nAlerts In Effect\\n----------------\\n\\nDismiss\\n\\n### Park Closures\\n\\n* #### Rose Farm Rehabilitation Project Closure Notice\\n \\n Alert 1, Severity closure, Rose Farm Rehabilitation Project Closure Notice\\n \\n As of May 3, 2023, the Rose Farm & Rose Lane are closed to all visitation. The house will undergo a full rehabilitation. This work prohibits the use of the area around the house and lane during construction. Worker safety and resource protection are key.\\n \\n\\n[more information on current conditions...](\/gett\/planyourvisit\/conditions.htm)\\n\\nDismiss [View all alerts](\/gett\/planyourvisit\/conditions.htm)\\n\\nCivil War Timeline\\n==================\\n\\n ![Greyscale political cartoon from 1860 showing four men tearing apart a map of the United States.](https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/1860-Election-Cartoon.jpg?maxwidth=1300&autorotate=false%20%221860%20Election%20Cartoon%22)\\n\\nA political cartoon from 1860 shows the four candidates, from left, Lincoln, Douglas, Breckenridge, and Bell tearing apart the United States.\\n\\nLibrary of Congress\\n\\n1860\\n----\\n\\n**November 6, 1860-** The American people elect Abraham Lincoln as sixteenth president of the United States. Lincoln is the first Republican president in the nation and represents a party that opposes the spread of slavery into the territories of the United States. \\n \\n**December 17, 1860-** The first state Secession Convention meets in Columbia, South Carolina. \\n \\n**December 20, 1860-** South Carolina secedes from the United States.\\n\\n ![Color illustration of cannons flying in arcs over the ocean to a stone fort.](https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/Ft-Sumter_1.jpg?maxwidth=1300&autorotate=false%20%22Bombardment%20of%20Ft.%20Sumter%22)\\n\\nOn April l12, 1861 Confederates in South Carolina fired on Fort Sumter, starting the American Civil War.\\n\\nLibrary of Congress\\n\\n1861\\n----\\n\\n**January 1861-** Mississippi, Florida, Alabama, Georgia, Louisiana, and Texas secede from the United States. \\n \\n**February 4, 1861-** The southern states that had seceded assemble delegates at Montgomery, Alabama to organize the Confederate States of America. The delegates are tasked with drafting a Confederate Constitution and establishing a provisional government. \\n \\n**February 18, 1861-** The delegates at the Montgomery Convention appoint Jefferson Davis as provisional President of the Confederate States of America at Montgomery, Alabama, a position he will hold until elections can be arranged. \\n \\n**March 4, 1861-** Abraham Lincoln is inaugurated as the sixteenth president of the United States in Washington, DC. \\n \\n**March 11, 1861-** Confederate delegates in Montgomery approve the Constitution of the Confederate States of America. \\n \\n**April 12, 1861-** Confederate forces fire upon [Fort Sumter, South Carolina](https:\/\/www.nps.gov\/fosu)\\n. The Civil War formally begins. \\n \\n**April 15, 1861-** President Lincoln issues a public declaration that an insurrection exists and calls for 75,000 militia to stop the rebellion. As a result of this call for volunteers, Virginia, Arkansas, North Carolina, and Tennessee secede from the Union in the following weeks. Lincoln will respond on May 3 with an additional call for 43,000+ volunteers to serve for three years, expanding the size of the Regular Army. \\n \\n**May 24, 1861-** United States forces cross the Potomac River and occupy Arlington Heights, the home of future Confederate General Robert E. Lee. It is during the occupation of nearby Alexandria that Colonel Elmer Ellsworth, commander of the 11th New York Infantry and a close friend of the Lincolns, is shot dead by the owner of the Marshall House just after removing a Confederate flag from its roof. Ellsworth is the first US officer killed in the war. \\n \\n**Late May, 1861-** Richmond becomes the capitol of the Confederacy. Richmond was the Confederacy's second largest and most industrialized city. \\n \\n**June 3, 1861-** A skirmish near Philippi in western Virginia, is the first clash of United States and Confederate forces in the east. \\n \\n**June 10, 1861-** Battle of Big Bethel, the first land battle of the war in Virginia. \\n \\n**June 20, 1861-** At the culmination of the Wheeling Convention, the northwestern counties of Virginia broke away from that state to form West Virginia. West Virginia will be officially designated and accepted as the 35th state of the Union on June 20, 1863. \\n \\n**July 21, 1861-** The [Battle of Bull Run (or First Manassas),](https:\/\/www.nps.gov\/mana)\\n is fought near Manassas, Virginia. The Union Army under General Irwin McDowell initially succeeds in driving back Confederate forces under General Pierre Gustav Toutant Beauregard, but the arrival of troops under General Joseph E. Johnston initiates a series of reverses that sends McDowell's army in a panicked retreat to the defenses of Washington. \\n \\n**July 1861-** To thwart the Confederate threat in northern Virginia, a series of [earthworks and forts are engineered to surround the City of Washington](https:\/\/www.nps.gov\/cwdw)\\n, adding to protection already offered by active posts such as [Fort Washington](https:\/\/www.nps.gov\/fowa)\\n on the Potomac River. \\n \\n**August 6, 1861-** US Congress passes and President Lincoln signs the Confiscation Act of 1861. This act permits court proceedings for the confiscation of property, including enslaved people, used to support the Confederacy. \\n \\n**August 10, 1861-** At the [Battle of Wilson's Creek, Missouri](https:\/\/www.nps.gov\/wicr)\\n the United States Army under General Nathaniel Lyon attacks Confederate troops and state militia southwest of Springfield, Missouri. After a disastrous day that included the death of Lyon, Confederate forces repel the Federal attack. The defeat emphasizes to US leaders the strong Confederate presence west of the Mississippi River. \\n \\n**August 28-29, 1861-** Fort Hatteras at Cape Hatteras, North Carolina, falls to United States naval forces. This begins the first Federal efforts to close Southern ports along the Carolina coast. \\n \\n**September 20, 1861-** Lexington, Missouri falls to Confederate forces under Sterling Price. \\n \\n**October 21, 1861-** Battle of Ball's Bluff, Virginia. Colonel Edward D. Baker, senator from Oregon and a friend of President Lincoln, led troops across the Potomac River only to be forced back to the river's edge where he was killed. The ensuing Union withdrawal turned into a rout with many soldiers drowning while trying to re-cross the icy waters of the Potomac River. \\n \\n**November 1, 1861-** President Lincoln appoints General George B. McClellan as General-in-Chief of all United States armies.\\n\\n ![Historical black and white photograph of a group of Black people, including men on horses and a woman on a wagon pulled by oxen crossing a low river while watched by white US soldier.](https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/Enslaved-People-Fording-Rappahanock.jpg?maxwidth=1300&autorotate=false%20%22Enslaved%20People%20Fording%20Rappahanock%22)\\n\\nIn the summer of 1862, enslaved people crossed into Federal lines seeking freedom. Over the course of the Civil War, US policy and war aims evolved, ultimately to include the abolition of slavery.\\n\\nLibrary of Congress\\n\\n1862\\n----\\n\\n**January 19, 1862-** Battle of Mill Springs, Kentucky. This Federal victory weakened the Confederate hold on the state. \\n \\n**February 6, 1862-** Surrender of Fort Henry, Tennessee. The loss of this southern fort on the Tennessee River opened the door to Federal control of the river. \\n \\n**February 8, 1862-** Battle of Roanoke Island, North Carolina. A Confederate defeat, the battle resulted in US occupation of eastern North Carolina and control of Pamlico Sound, to be used as Northern base for further operations against the southern coast. \\n \\n**February 16, 1862-** [Surrender of Fort Donelson, Tennessee](https:\/\/www.nps.gov\/fodo)\\n. This critical fort on the Cumberland River left the river in Federal control. It was here that US General Ulysses S. Grant gained his nickname \\\"Unconditional Surrender\\\" Grant. \\n \\n**February 22, 1862-** Jefferson Davis is inaugurated as President of the Confederate States of America. \\n \\n**March 7-8, 1862-** [Battle of Pea Ridge (Elkhorn Tavern), Arkansas.](https:\/\/www.nps.gov\/peri)\\n The US victory here loosened the Confederate hold on Missouri and disrupted southern control of a portion of the Mississippi River. \\n \\n**March 8-9, 1862-** The Battle of Hampton Roads pits USS Monitor and the CSS Virginia (the old USS Merrimack), the first ironclads, against one another off the Virginia coast. On March 8, the CSS Virginia destroys two wooden-hulled Federal ships. On March 9, the USS Monitor arrived and the two ironclads fought for hours, neither inflicting much damage on the other. \\n \\n**April 6-7, 1862-** [The Battle of Shiloh (Pittsburg Landing),](https:\/\/www.nps.gov\/shil)\\n the first major battle in Tennessee. Confederate General Albert Sidney Johnston, a veteran of the Texas War of Independence and the War with Mexico considered to be one of the finest officers in the Confederacy, is killed on the first day of fighting. The Federal victory further secures the career of US General Ulysses S. Grant. \\n \\n**April 24-25, 1862-** A Federal fleet of gunships under Admiral David Farragut passes Confederate forts guarding the mouth of the Mississippi River. On April 25, the fleet arrived at New Orleans where they demanded the surrender of the city. Within two days the forts fall to Federal forces and the mouth of the great river is under United States control. \\n \\n**May 25, 1862-** First Battle of Winchester, Virginia. After two weeks of maneuvering and battles at Cross Keys and Front Royal, Confederate General \\\"Stonewall\\\" Jackson attacks US forces at Winchester and successfully drives them from the city. The victory is the culmination of his 1862 Valley Campaign. \\n \\n**May 31-June 1, 1862-** [The Battle of Seven Pines near Richmond, Virginia.](https:\/\/www.nps.gov\/rich)\\n General Joseph Johnston, commander of the Confederate army in Virginia is wounded and replaced by Robert E. Lee who renames his command the \\\"Army of Northern Virginia\\\". \\n \\n**June 6, 1862-** Battle of Memphis, Tennessee. A US flotilla under Commodore Charles Davis successfully defeats a Confederate river force on the Mississippi River near the city and Memphis surrenders. The Mississippi River is now in Federal control except for its course west of Mississippi where the city of Vicksburg stands as the last Confederate stronghold on the great river. \\n \\n**June 25-July 1, 1862-** [The Seven Days' Battles before Richmond](https:\/\/www.nps.gov\/rich)\\n. General Lee's army attacks the US Army of the Potomac under General George McClellan in a succession of battles beginning at Mechanicsville on June 26 and ending at Malvern Hill on July 1. \\n \\n**July 17, 1862-** President Lincoln approves the Confiscation Act of 1862, or Second Confiscation Act. This act expands the terms of the previous Confiscation Act, allows broader seizure of Confederate property, the emancipation of enslaved people in Federally occupied territory, and prohibits the return of fugitive slaves. \\n \\n**August 30-31, 1862-** The [Battle of Second Bull Run (or Second Manassas)](https:\/\/www.nps.gov\/mana)\\n is fought on the same ground where one year before, the United States army was defeated and sent reeling in retreat to Washington. Likewise, the result of this battle is a US defeat. \\n \\n**September 17, 1862-** [The Battle of Antietam (or Sharpsburg), Maryland,](https:\/\/www.nps.gov\/anti)\\n the bloodiest single day of the Civil War. The result of the battle ends Confederate General Lee's first invasion of the North. \\n \\n**September 22, 1862-** Following the US victory at Antietam, President Lincoln introduces the Preliminary Emancipation Proclamation, which announced Lincoln's intention to declare all enslaved people free on January 1, 1863 if those places remained in rebellion at that time. \\n \\n**December 11-15, 1862-** [The Battle of Fredericksburg, Virginia](https:\/\/www.nps.gov\/frsp)\\n. The Confederate Army of Northern Virginia, under General Lee, wins a lopsided victory over the US Army of the Potomac, under General Ambrose Burnside, after Federal forces conducted a risky river crossing in an attempt to win a victory on Confederate soil before the release of Emancipation Proclamation. \\n \\n**December 24, 1862-** Jefferson Davis writes an order declaring US General Benjamin Butler to be an outlaw for his treatment of the civilians of New Orleans. Included in this proclamation is a statement that Lincoln's upcoming Emancipation Proclamation is designed to \\\"excite servile war\\\" and that any black US soldiers or their white officers are to be sent to the individual states instead of being treated as prisoners of war. \\n \\n**December 31-January 3, 1863-** [Battle of Stones River, Tennessee](https:\/\/www.nps.gov\/srnc)\\n. Fought between the US Army of the Cumberland under General William Rosecrans and the Confederate Army of Tennessee under General Braxton Bragg, the costly Federal victory frees middle Tennessee from Confederate control and boosts Northern morale.\\n\\n ![Historical black and white photograph of flat, open field with scattered dead bodies.](https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/Gettysburg-Dead.jpg?maxwidth=1300&autorotate=false%20%22Gettysburg%20Dead%22)\\n\\nAs casualties mounted, battlefield photography displayed the awful spectacle of battle to an American public that had largely romanticized war at the beginning of the conflict.\\n\\nLibrary of Congress\\n\\n1863\\n----\\n\\n**January 1, 1863-** The Emancipation Proclamation goes into effect. The Emancipation Proclamation was a war measure that declared enslaved people in rebelling states to be free, authorized the enlistment of black troops, and outraged white Southerners. The proclamation was an important turning point in the war for the United States and in the eventual shift from the goal of restoring the Union as it was, to building a better Union without slavery. \\n \\n**March 3, 1863-** Conscription, or the drafting of soldiers into military service, begins in the North. It had begun in the Confederacy the year before. \\n \\n**April 1863-** Federal forces in the east begin a new campaign in Virginia to flank Lee's Army of Northern Virginia at Fredericksburg. In the west, a Federal army has begun a campaign to surround and take Vicksburg, Mississippi, the last Confederate stronghold on the Mississippi River. \\n \\n**April 30-May 6, 1863-** [Battle of Chancellorsville, Virginia.](https:\/\/www.nps.gov\/frsp)\\n US General Joseph Hooker's plan to flank Lee falls apart and Union forces retreat. Lee's victory at Chancellorsville is marred by high casualties, including the mortal wounding of \\\"Stonewall\\\" Jackson, who dies on May 10. Soon after, Lee asks Jefferson Davis for permission to invade the North and take the war out of Virginia. \\n \\n**May 1, 1863-** The Confederate Congress passes a Retaliatory Act in line Jefferson Davis' earlier proclamation and in response to the Emancipation Proclamation. The act establishes that the Confederacy considers the enlistment of black troops to be the equivalent of inciting a servile rebellion, white officers of black troops are to be executed, and black troops taken prisoner are to be sent to the states, where they could be executed or re-enslaved. \\n \\n**May 18, 1863-** [Siege of Vicksburg, Mississippi](https:\/\/www.nps.gov\/vick\/index.htm)\\n begins. US forces under General Ulysses S. Grant attack Confederate defenses outside the city on May 19-22. If Vicksburg falls, the Mississippi River will be completely controlled by the United States. \\n \\n**May 22, 1863-** The US War Department issues General Order No. 143 establishes the United States Colored Troops. \\n \\n**June 9, 1863-** Battle of Brandy Station, Virginia. US cavalry forces cross the Rapidan River to attack General J.E.B. Stuart's cavalry and discover that Lee's men are moving west toward the Shenandoah Valley. The largest cavalry battle of the Civil War, it also marks the beginning of the Gettysburg Campaign. Meanwhile, the Federal assault on [Vicksburg, Mississippi](https:\/\/www.nps.gov\/vick)\\n has become a siege of the city where soldiers and civilians alike suffer from constant bombardment. \\n \\n**June 14-15, 1863-** Battle of Second Winchester, Virginia. Confederate troops under General Richard Ewell defeat Union troops under General Robert Milroy, clearing the Shenandoah Valley of Federal forces. \\n \\n**June 28, 1863-** [The Gettysburg Campaign](https:\/\/www.nps.gov\/gett)\\n continues. Confederates pass through York and reach the bridge over the Susquehanna River at Columbia, but Federal militia set fire to the bridge, denying access to the east shore. Confederate cavalry skirmishes with Federal militia near Harrisburg, Pennsylvania. \\n \\n**July 1-3-** [Battle of Gettysburg, Pennsylvania.](https:\/\/www.nps.gov\/gett)\\n The bloodiest battle of the Civil War dashes Robert E. Lee's hopes for a successful invasion of the North. \\n \\n**July 4-** [Vicksburg, Mississippi,](https:\/\/www.nps.gov\/vick)\\n surrenders to the US Army under Grant. The capture of Vicksburg gives the Unites States complete control of the Mississippi River, a vital supply line for the Confederate states in the west. At Gettysburg, Lee begins his retreat to Virginia. \\n \\n**July 10-11, 1863-** US naval and land forces attack Confederate defenses near Charleston, South Carolina. Among the United States troops is the 54th Massachusetts Colored Infantry, the first African American regiment of volunteers to see combat in the Civil War. \\n \\n**July 13, 1863-** Draft Riots begin in New York City and elsewhere as disgruntled workers and laborers, seething over the draft system that seemingly favors the rich, attack the draft office and African American churches. The riots continue through July 16. \\n \\n**July 13-14, 1863-** Near Falling Waters, Maryland, US troops skirmish with Lee's rearguard. That night the Army of Northern Virginia crosses the Potomac River and the Gettysburg Campaign ends. \\n \\n**July 18, 1863-** Second Assault on Battery Wagner, South Carolina. Leading the US infantry charge is the 54th Massachusetts Colored Infantry commanded by Colonel Robert Gould Shaw who is killed and buried with the dead of his regiment. \\n \\n**July 30, 1863-** Lincoln issues General Order 252 in response to the Confederate refusal to treat black soldiers the same as white soldiers. General Order 252 declares that for any US prisoner killed in violation of the laws of war, a Confederate prisoner would be killed in exchange. The prisoner exchange system effectually suspended. \\n \\n**August 21, 1863-** Sacking of Lawrence, Kansas. In a murderous daylight raid, Confederate and Missouri guerillas under William Clarke Quantrill storm into Lawrence and destroy most of the town. Approximately 150 men and boys are murdered by Quantrill's men. \\n \\n**September 9, 1863-** Chattanooga, Tennessee, is occupied by Federal forces under General William Rosecrans whose Army of the Cumberland will soon invade northern Georgia. \\n \\n**September 19-20, 1863-** [The Battle of Chickamauga,](https:\/\/www.nps.gov\/chch)\\n Georgia. The US Army of the Cumberland under General William Rosecrans is defeated and nearly routed by the Confederate Army of Tennessee commanded by General Braxton Bragg. Rosecrans' army retreats to the supply base at Chattanooga, Tennessee. \\n \\n**September-November 1863-** [The Siege of Chattanooga, Tennessee](https:\/\/www.nps.gov\/chch)\\n. Confederate forces under Braxton Bragg surround the occupied city. General Ulysses S. Grant is assigned to command the troops there and begins immediate plans to relieve the besieged US Army. \\n \\n**October 5, 1863-** Outside of Charleston Harbor, the Confederate David, a partially submerged, steam powered vessel, attacked the New Ironsides, part of the US fleet blockading the harbor, with a torpedo. Both ships survived the attack, though the commander of the David and one of his crew were captured. \\n \\n**October 9 -22, 1863-** Bristoe Station Campaign. In a feint toward Washington, Lee's Army of the Northern Virginia marches into northern Virginia in an attempt to flank the Army of the Potomac, under General Meade. Lee successfully outmaneuvers Meade though fails to bring him to battle or catch him in the open. An engagement at Bristoe Station, Virginia, on October 14 gives the campaign its name. \\n \\n**November 19, 1863-** Dedication of the Soldiers' National Cemetery at Gettysburg. President Abraham Lincoln delivers the Gettysburg Address. \\n \\n**November 23-25, 1863-** [Battles for Chattanooga.](https:\/\/www.nps.gov\/chch)\\n US forces break the Confederate siege of the city in successive attacks. The most notable event is the storming of Lookout Mountain on November 24 and Battle of Missionary Ridge the following day. The decisive Federal victory sends the Confederate Army south into Georgia where General Bragg reorganizes his forces before resigning from command on November 30. \\n \\n**November 26-December 1, 1863**\\\\- The Mine Run Campaign. US General Meade's Army of the Potomac marches against Confederate General Lee's Army of Northern Virginia south of the Rapidan River, east of Orange Court House. Lee reacts and throws up a line of defenses along the banks of Mine Run Creek. After several days of probing the defenses, Meade withdraws north of the Rapidan and goes into winter quarters. \\n \\n**November 27 to December 3, 1863-** Siege of Knoxville, Tennessee. Confederate troops under General James Longstreet lay siege to the city of Knoxville held by Federal forces under General Ambrose Burnside. Longstreet finally attacks on November 30 but is repulsed with heavy losses. The arrival of US reinforcements forces him to withdraw to Greeneville, Tennessee, where his corps will spend the winter. \\n \\n**December 8, 1863-** Lincoln Issues his Proclamation of Amnesty and Reconstruction, which would pardon those who participated in the \\\"existing rebellion\\\" if they take an oath to the United States.\\n\\n ![Historical black and white photograph of US General Ulysses S. Grant, standing, with his military staff, all seated in front of a tent.](https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/Grant-and-Staff_2.jpg?maxwidth=1300&autorotate=false%20%22Grant%20and%20Staff%20at%20Cold%20Harbor%22)\\n\\nWith the pressure of an election looming, in March of 1864, Lincoln appointed General Ulysses S. Grant to be commander of all the US armies. The war was far from decided and the fate of the Union was still uncertain.\\n\\nLibrary of Congress\\n\\n1864\\n----\\n\\n**February 9, 1864-** Escape from Libby Prison, Richmond. After weeks of digging, 109 United States officers made their escape from the notorious Libby Prison, the largest and most sensational escape of the war. Though 48 of the escapees were later captured and two drowned, 59 were able to make their way into US lines. \\n \\n**February 27, 1864-** In Georgia, Camp Sumter Prison Camp opens. Universally referred to as [Andersonville Prison Camp](https:\/\/www.nps.gov\/ande)\\n, it will become notorious for overcrowded conditions and a high death rate among its inmates. \\n \\n**February 14-20, 1864-** Federal capture and occupation of Meridian, Mississippi. Federal forces under William T. Sherman enter the city of Meridian, Mississippi after a successful month of campaigning through the central part of the state. The capture of this important Southern town, well known for its industry and storage capabilities, severely hampers the efforts of Confederate commanders to sustain their armies in the Deep South, Georgia and west of the Mississippi River. \\n \\n**February 17, 1864-** First successful submarine attack of the Civil War. The CSS H.L. Hunley, a seven-man submergible craft, attacked the USS Housatonic outside of Charleston, South Carolina. Struck by the submarine's torpedo, the Housatonic broke apart and sank, taking all but five of her crew with her. Likewise, the Hunley was also lost and never heard from again until discovered in 1995 at the spot where it sank after the attack. \\n \\n**March 2, 1864-** US General Ulysses S. Grant is appointed lieutenant general, a rank revived at the request of President Lincoln. Grant assumes command of all United States Armies in the field the following day. \\n \\n**March 10, 1864-** The Red River Campaign begins. As part of an overall Federal strategy to strike deep into various parts of the Confederacy, a combined force of army and navy commands under General Nathaniel Banks begins a campaign on the Red River in Louisiana. \\n \\n**April 8, 1864-** Battle of Sabine Crossroads or Mansfield, Louisiana, the first major battle of the Red River Campaign in Louisiana. \\n \\n**April 9, 1864-** Battle of Pleasant Hill, Louisiana. The United States Army under Banks defeats the attempt by Confederate forces under General Richard Taylor to drive them out of Louisiana. The result of the campaign would be less than desired as it drew to a close in the first week of May with Confederates still in control of most of the state. \\n \\n**April 12, 1864-** Capture of Fort Pillow, Tennessee. After a rapid raid through central and western Tennessee, Confederate cavalry under Nathan Bedford Forrest attacked and overwhelmed the Federal garrison at Fort Pillow, located on the Mississippi River. Forrest's troops murdered nearly 300 United States soldiers after they had surrendered, most of whom were African American. Congress investigated the affair and while Confederate authorities denied any wrongdoing, the events at Fort Pillow cast a pall over Forrest's reputation and remained an emotional issue throughout the remainder of the war and after. \\n \\n**April 17, 1864-** Grant forbids prisoner exchange talks to progress unless Confederate authorities agree to treat black soldiers the same as white and until Confederates release enough US soldiers to make up for the large number of Confederates paroled at Vicksburg and Port Hudson. \\n \\n**May 5-6, 1864-** [Battle of the Wilderness, Virginia](https:\/\/www.nps.gov\/frsp)\\n, the opening battle of the Overland Campaign. US General Ulysses S. Grant, accompanying the Army of the Potomac under General Meade, issued orders for the campaign to begin on May 3. Lee responded by attacking the Federal column in the dense woods and underbrush of an area known as the Wilderness, west of Fredericksburg, Virginia. \\n \\n**May 7, 1864-** Beginning of the Atlanta Campaign. With three US Armies under his command, General William T. Sherman marched south from Tennessee into Georgia against the Confederate Army of Tennessee under General Joseph Johnston, the objective being the city of Atlanta. \\n \\n**May 8-21, 1864-** [Battle of Spotsylvania Court House, Virginia](https:\/\/www.nps.gov\/frsp)\\n. Lee successfully stalls Grant's drive toward Richmond. \\n \\n**May 11, 1864-** Battle of Yellow Tavern. Six miles north of Richmond, Confederate cavalry under General J.E.B. Stuart block Federal cavalry under General Philip Sheridan. General Stuart was mortally wounded during the encounter. \\n \\n**May 14-15, 1864-** Battle of Resaca, Georgia. General Sherman's armies are blocked at Resaca by General Johnston's Army of Tennessee. After two days of maneuvering and intense fighting, Johnston withdraws. Sherman will advance but take precautions against ordering any further massed assaults where high casualties may occur. \\n \\n**June 1-3, 1864-** [Battle of Cold Harbor, Virginia](https:\/\/www.nps.gov\/rich)\\n. Relentless and bloody US attacks fail to dislodge Lee's army from its strong line of defensive works northeast of Richmond. \\n \\n**June 8, 1864-** Abraham Lincoln is nominated for a second term as president. \\n \\n**June 10, 1864-** [Battle of Brice's Crossroads, Mississippi](https:\/\/www.nps.gov\/brcr)\\n\\\\- In spite of being outnumbered almost two to one, Confederate General Nathan Bedford Forrest attacks and routs the Federal command under General Samuel Sturgis. \\n \\n**June 15-18, 1864-** [Assault on Petersburg, Virginia](https:\/\/www.nps.gov\/pete)\\n. After withdrawing from the lines at Cold Harbor, the Army of the Potomac crossed the James River and with troops from the Army of the James attacked the outer defenses of Petersburg, the primary junction for several southern railroads. After four days of bloody attacks, Grant accepts that only a siege can systematically isolate the city and cut off Confederate supplies to the capital of Richmond. \\n \\n**June 19, 1864-** The USS Kearsarge sinks the Confederate raider CSS Alabama near Cherbourg, France. \\n \\n**June 27, 1864-** [Battle of Kennesaw Mountain, Georgia](https:\/\/www.nps.gov\/kemo)\\n. After weeks of maneuvering and battles, Sherman's Army of the Cumberland and Army of the Tennessee smash headlong into Johnston's carefully planned defenses at Big and Little Kennesaw. Johnston remains on this line until July 2, when he retreats at the threat being flanked by Sherman's mobile force. \\n \\n**July 9, 1864-** [Battle of Monocacy, Maryland](https:\/\/www.nps.gov\/mono)\\n. In an attempt to draw Federal troops away from the ongoing siege of Petersburg and Richmond, a Confederate force under Jubal Early quietly moved north into Maryland. Early had made excellent progress until he reached Frederick, Maryland, where a force of 6,000 Federal troops under General Lew Wallace, was arrayed to delay his advance. Though the battle was a US defeat, it was also touted as \\\"the battle that saved Washington\\\" for it succeeded in holding back Early's march until troops could be sent to the capital's defense. \\n \\n**July 11-12, 1864-** Attack on the Defenses of Washington. Jubal Early's troops arrive on the outskirts of Washington, DC, and trade cannon fire with a token Federal force remaining in the forts around the city. President Lincoln observes the skirmishing from Fort Stevens as reinforcements from the Army of the Potomac arrive and quickly fill in the works. Early withdraws that evening. \\n \\n**July 14-15, 1864-** [Battles near Tupelo, Mississippi.](https:\/\/www.nps.gov\/tupe)\\n The US defeat of Nathan Bedford Forrest secured the supply lines to Sherman's armies operating against Atlanta, Georgia. \\n \\n**July 17, 1864-** General John Bell Hood replaces General Joseph Johnston as commander of the Army of Tennessee. This change in command signals a new Confederate strategy to thwart Sherman's campaign, though the end result will be disastrous for the Confederate cause. \\n \\n**July 20, 1864-** Battle of Peachtree Creek, Georgia, the first major battle around the city of Atlanta. General Hood sends his army out of the city's defenses to attack the approaching Federal troops under George Thomas. After several hours of fierce fighting, Hood withdrew back to his own defensive works. \\n \\n**July 21, 1864-** The Battle of Atlanta. Hood's second effort to throw back Federal forces under Sherman brings him heavy casualties with no positive results. General James McPherson, commander of the US Army of the Tennessee, is killed during the fighting. \\n \\n**July 30, 1864-** The [Battle of the Crater at Petersburg, Virginia](https:\/\/www.nps.gov\/pete)\\n. After a month of tunneling by soldiers of the 48th Pennsylvania Infantry, a Federal forces explode a massive mine under a Confederate fort in the Petersburg siege lines. The infantry charge that followed was poorly coordinated and by day's end, Confederate counterattacks had driven out the US troops and the siege lines remained unchanged. \\n \\n**August 5, 1864-** Battle of Mobile Bay. A US fleet under Admiral David Farragut steamed into Mobile Bay outside the city of Mobile, Alabama, defended by two strong forts and a small southern flotilla, including the formidable ironclad CSS Tennessee. Farragut's ships defeated the Confederate ships and bypassed the forts, capturing the important Southern port. \\n \\n**August 18-19, 1864-** Battles on the Weldon Railroad near Petersburg, Virginia. US attempts to capture this important railroad into Petersburg were stopped by Confederate counterattacks. Despite Confederate efforts, the US remained in firm possession of their gains and the railroad. \\n \\n**August 25, 1864-** Battle of Ream's Station, near Petersburg, Virginia. A surprise Confederate counterattack briefly stopped Federal destruction of the Weldon Railroad near Ream's Station, though failed to release the Federal grip on this important supply line into Petersburg. \\n \\n**August 31- September 1, 1864-** Battle of Jonesborough, Georgia. The final Confederate counterattack against United States troops outside the city of Atlanta fails. \\n \\n**September 1, 1864-** Fall of Atlanta, Georgia. Confederate troops under General Hood evacuate the city of Atlanta. General Sherman's army occupies the city and its defenses the following day. \\n \\n**September 19, 1864-** Third Battle of Winchester, Virginia. US forces under General Philip Sheridan attacked the Confederate army under Jubal Early near the city of Winchester and drove them southward, up the Shenandoah Valley. \\n \\n**September 22, 1864-** Battle of Fisher's Hill, Virginia. The US Army of the Shenandoah under General Philip Sheridan attacked Jubal Early's Confederates near Fisher's Hill, overpowering the Confederates and again forcing them to flee the battlefield. United States officers and officials in Washington believe this to be the final battle in the Shenandoah Valley. \\n \\n**September 29-30, 1864-** Battle of Fort Harrison near Richmond, Virginia. In a sweeping assault, the Confederate stronghold known as Fort Harrison falls to the Army of the James. Confederate efforts to retake the fort fail. \\n \\n**October 19, 1864-** [The Battle of Cedar Creek, Virginia](https:\/\/www.nps.gov\/cebe)\\n. In an early morning surprise attack, Jubal Early's Confederates successfully attack and drive troops of the Army of the Shenandoah from their camps on the banks of Cedar Creek south of Middletown, Virginia. Hearing the fight from his headquarters at Winchester, General Philip Sheridan rides southward, rallying dispirited troops who return to the battlefield. By day's end, Early's forces are put to flight. Despite several attempts to disrupt the US advance in the coming weeks, the struggle for control of the Shenandoah Valley is over. \\n \\n**November 8, 1864-** Abraham Lincoln is reelected president of the United States. \\n \\n**November 16, 1864-** General Sherman's Army of Georgia begins the March to the Sea. \\n \\n**November 30, 1864-** Battle of Franklin, Tennessee. After a month of raiding Sherman's supply lines and attacking Federal outposts, John Bell Hood's army confronts US troops from General John Schofield's command, who they had encountered the day before near Spring Hill, Tennessee. A massive frontal assault on the well entrenched Federal line meets with disaster. Despite some taking of outside works and defenses, the toll for Hood's forces is too heavy including the loss of six of his generals. US troops retreat in the direction of Nashville. \\n \\n**December 10, 1864-** Harassed only by scattered Georgia militia, Sherman's Army of Georgia arrives at Savannah, Georgia, completing the famous March to the Sea. At Savannah, his troops will take Fort McAllister and force Confederate defenders to evacuate the city. \\n \\n**December 15-16, 1864-** The Battle of Nashville, Tennessee. The Confederate Army under John Bell Hood is thoroughly defeated and the threat to Tennessee ends.\\n\\n ![Colored illustration of orderly lines of United States soldiers, on foot and on horseback passing a crown with American flags lining the walkways.](https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/Grand-review.jpg?maxwidth=1300&autorotate=false%20%22The%20Grand%20Review%20at%20Washington%20May%2023,%201865.%20The%20Glorious%20Army%20of%20the%20Potomac%20Passing%20the%20Head%20Stand%22)\\n\\nThe Grand Review in May 1865 celebrated the United States victory on the Civil War and the reunification of the nation. The future of the new United States, especially in the wake of the assassination of President Abraham Lincoln, was anything but clear.\\n\\nLibrary of Congress\\n\\n1865\\n----\\n\\n**January 15, 1865-** Assault and capture of Fort Fisher, North Carolina. United States occupation of this fort at the mouth of the Cape Fear River closes access to Wilmington, the last Southern seaport on the east coast that was open to blockade runners and commercial shipping. \\n \\n**February 1, 1865-** Sherman's Army leaves Savannah to march through the Carolinas. \\n \\n**February 17, 1865-** Sherman's Army captures Columbia, South Carolina while Confederate defenders evacuate Charleston, South Carolina. \\n \\n**February 22, 1865-** Wilmington, NC, falls to Federal troops, closing the last important Southern port on the east coast. On this same day, Joseph E. Johnston is restored to command the nearly shattered Army of the Tennessee, vice John B. Hood who resigned a month earlier. \\n \\n**March 4, 1865-** President Abraham Lincoln is inaugurated for his second term as president in Washington, DC. \\n \\n**March 11, 1865-** Sherman's Army occupies Fayetteville, North Carolina. \\n \\n**March 16 and 19-21, 1865-** The Battles of Averasborough and Bentonville, North Carolina. Sherman's army is stalled in its drive northward from Fayetteville but succeeds in passing around the Confederate forces toward its object of Raleigh. \\n \\n**March 25, 1865-** [Attack on Fort Stedman, Petersburg,](https:\/\/www.nps.gov\/pete)\\n Virginia. Touted as \\\"Lee's last offensive,\\\" Confederate troops under General John B. Gordon attack and briefly capture the Federal fort in the Petersburg siege lines in an attempt to thwart US plans for a late March assault. By day's end, the Confederates will be thrown out and the lines remain unchanged. \\n \\n**April 1, 1865-** [The Battle of Five Forks, Virginia](https:\/\/www.nps.gov\/pete)\\n. The Confederate defeat at Five Forks initiates General Lee's decision to abandon the Petersburg-Richmond siege lines. \\n \\n**April 2, 1865-** The Fall of Petersburg and [Richmond](https:\/\/www.nps.gov\/rich)\\n. General Lee abandons both cities and moves his army west in hopes of joining Confederate forces under General Johnston in North Carolina. \\n \\n**April 3, 1865-** US troops occupy Richmond and Petersburg, Virginia. \\n \\n**April 6, 1865-** The Battle of Sailor's Creek, Virginia. A portion of Lee's Army, almost one-third of it, is cornered along the banks of Sailor's (or \\\"Saylor's\\\") Creek and annihilated. \\n \\n**April 9, 1865-** [Battle of Appomattox Court House and Surrender, Appomattox Court House, Virginia.](https:\/\/www.nps.gov\/apco)\\n After an early morning attempt to break through Federal forces blocking the route west to Danville, Virginia, Lee seeks an audience with General Grant to discuss terms. That afternoon in the parlor of Wilmer McLean, Lee signs the document of surrender. On April 12, the Army of Northern Virginia formally surrenders and is disbanded. \\n \\n**April 14, 1865-** President Abraham Lincoln is assassinated by actor John Wilkes Booth at [Ford's Theater](https:\/\/www.nps.gov\/foth)\\n in Washington, DC. On the same day, Fort Sumter, South Carolina is re-occupied by US troops. \\n \\n**April 15, 1865-** Vice President Andrew Johnson is sworn in as 17th President of the United States. \\n \\n**April 26, 1865-** General Joseph Johnston signs the surrender document for the Confederate Army of the Tennessee and miscellaneous Confederate troops attached to his command at Bennett's Place near Durham, North Carolina. \\n \\n**May 4, 1865-** General Richard Taylor surrenders Confederate forces in the Department of Alabama, Mississippi and East Louisiana. \\n \\n**May 10, 1865-** Confederate President Jefferson Davis is captured near Irwinville, Georgia. \\n \\n**May 12, 1865-** The final battle of the Civil War takes place at Palmito Ranch, Texas. It is a Confederate victory. \\n \\n**May 23, 1865-** The Grand Review of the Army of the Potomac in Washington, DC. \\n \\n**May 24, 1865-** The Grand Review of General Sherman's Army in Washington, DC. \\n \\n**May 26, 1865-** General Simon Bolivar Buckner agrees to terms of surrender of the Army of the Trans-Mississippi, which are agreed to on June 2, 1865. With this surrender of the last large Confederate army, the Civil War officially ends. (Confederate Brigadier General Stand Waite did not surrender until June 23, and one Confederate ship, the CSS Shenandoah, docked in Liverpool and surrendered to the Royal Navy on November 6, 1865.)\\n\\nLast updated: October 6, 2022\\n\\n### Success\\n\\nThank you. Your feedback has been received.\\n\\n### Error\\n\\nalert message\\n\\nWas this page helpful?\\n----------------------\\n\\n Yes\\n\\n No\\n\\nHow could we improve this page? 500 characters allowed\\n\\nSubmit\\n\\nPark footer\\n-----------\\n\\n### Contact Info\\n\\n#### Mailing Address:\\n\\n1195 Baltimore Pike \\nGettysburg, PA 17325\\n\\n#### [Contact Us](\/gett\/contacts.htm)\\n\\n### Tools\\n\\n* [Site Index](\/gett\/siteindex.htm)\\n \\n* [Espa\u00f1ol](\/gett\/espanol\/index.htm)\\n \\n\\n### Stay Connected\\n\\n* [Facebook](http:\/\/www.facebook.com\/GettysburgNPS)\\n \\n* [Twitter](http:\/\/twitter.com\/gettysburgnmp)\\n \\n* [Instagram](http:\/\/www.instagram.com\/gettysburgnps)\\n \\n* [YouTube](http:\/\/www.youtube.com\/GettysburgNPS)\\n \\n\\n \\n\\npreviousnextstart slideshow\",\"metadata\":{\"title\":\"Civil War Timeline - Gettysburg National Military Park (U.S. National Park Service)\",\"description\":\"A time line of the American Civil War\",\"language\":\"en\",\"ogTitle\":\"Civil War Timeline - Gettysburg National Military Park (U.S. National Park Service)\",\"ogDescription\":\"A time line of the American Civil War\",\"ogUrl\":\"https:\/\/www.nps.gov\/gett\/learn\/historyculture\/civil-war-timeline.htm\",\"ogImage\":\"https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/1860-Election-Cartoon.jpg\",\"ogLocaleAlternate\":[],\"viewport\":\"width=device-width, initial-scale=1.0\",\"apple-itunes-app\":\"app-id=1549226484, app-argument=https:\/\/apps.apple.com\/us\/app\/national-park-service\/id1549226484\",\"og:type\":\"website\",\"og:title\":\"Civil War Timeline - Gettysburg National Military Park (U.S. National Park Service)\",\"og:url\":\"https:\/\/www.nps.gov\/gett\/learn\/historyculture\/civil-war-timeline.htm\",\"og:description\":\"A time line of the American Civil War\",\"og:image\":[\"https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/1860-Election-Cartoon.jpg\",\"https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/Ft-Sumter_1.jpg\",\"https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/Enslaved-People-Fording-Rappahanock.jpg\",\"https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/Gettysburg-Dead.jpg\",\"https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/Grant-and-Staff_2.jpg\",\"https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/Grand-review.jpg\"],\"og:image:height\":[\"2000\",\"2500\",\"2211\",\"2026\",\"2500\",\"2500\"],\"og:image:width\":[\"2928\",\"3814\",\"3384\",\"3300\",\"3846\",\"3849\"],\"og:image:alt\":[\"Greyscale political cartoon from 1860 showing four men tearing apart a map of the United States.\",\"Color illustration of cannons flying in arcs over the ocean to a stone fort.\",\"Historical black and white photograph of a group of Black people, including men on horses and a woman on a wagon pulled by oxen crossing a low river while watched by white US soldier.\",\"Historical black and white photograph of flat, open field with scattered dead bodies.\",\"Historical black and white photograph of US General Ulysses S. Grant, standing, with his military staff, all seated in front of a tent.\",\"Colored illustration of orderly lines of United States soldiers, on foot and on horseback passing a crown with American flags lining the walkways.\"],\"sourceURL\":\"https:\/\/www.nps.gov\/gett\/learn\/historyculture\/civil-war-timeline.htm\",\"statusCode\":200}}}" +} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainFirecrawlTool-a08c0ae23dd3be2864787728bf4e74c4.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainFirecrawlTool-a08c0ae23dd3be2864787728bf4e74c4.json new file mode 100644 index 0000000..6285b6a --- /dev/null +++ b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainFirecrawlTool-a08c0ae23dd3be2864787728bf4e74c4.json @@ -0,0 +1,8 @@ +{ + "statusCode": 200, + "headers": { + "X-Powered-By": "Express", + "Access-Control-Allow-Origin": "*" + }, + "data": "{\"success\":true,\"data\":{\"markdown\":\"Your Profile\\n\\n[![](https:\/\/www.history.com\/assets\/images\/history\/logo.svg)History](\/)\\n\\n* [Find History on Facebook (Opens in a new window)](https:\/\/www.facebook.com\/History)\\n \\n* [Find History on Twitter (Opens in a new window)](https:\/\/twitter.com\/history)\\n \\n* [Find History on YouTube (Opens in a new window)](https:\/\/www.youtube.com\/subscription_center?add_user=historychannel)\\n \\n* [Find History on Instagram (Opens in a new window)](http:\/\/instagram.com\/history)\\n \\n* [Find History on TikTok (Opens in a new window)](https:\/\/www.tiktok.com\/@history)\\n \\n\\n[Email Updates](\/emails\/sign-up)\\n\\n* [Live TV](https:\/\/play.history.com\/live)\\n \\n* [History Classics](https:\/\/play.history.com\/channel\/ancient-aliens-fan-favorites)\\n \\n* [Shows](https:\/\/www.history.com\/shows)\\n \\n* [This Day In History](https:\/\/www.history.com\/this-day-in-history)\\n \\n* [Schedule](https:\/\/www.history.com\/schedule)\\n \\n* [Topics](https:\/\/www.history.com\/topics)\\n \\n* [Stories](https:\/\/www.history.com\/news)\\n \\n* [Videos](https:\/\/www.history.com\/videos)\\n \\n* [History Podcasts](https:\/\/www.history.com\/podcasts)\\n \\n* [History Vault](https:\/\/www.historyvault.com\/?cmpid=HV_O_Site_H_Menu)\\n \\n\\n![](https:\/\/www.history.com\/editorial\/_next\/image?url=https%3A%2F%2Fassets.editorial.aetnd.com%2Fuploads%2F2012%2F05%2Fthis-day-in-history-11-19-1863-lincoln-gettysburg-address.jpg&w=3840&q=75)\\n\\n[1863](\/this-day-in-history\/year\/1863)\\n\\nPresident Lincoln delivers Gettysburg Address\\n=============================================\\n\\nThis Day In History: 11\/19\/1863 - Lincoln Gettysburg Address\\n\\nPlay Video\\n\\nLearn more\\n\\nRelated contentRelated contentShare VideoShare Video\\n\\nPlaying on\\n\\nSubtitles\\n\\nLanguage\\n\\nSettings\\n\\n* QualityAutomatic Automatic HD\\n* SpeedNormal\\n* SubtitleOptions\\n\\nQuality\\n\\n* Automatic\\n\\nSpeed\\n\\n* 0.25\\n* 0.5\\n* Normal\\n* 1.25\\n* 1.5\\n* 2\\n\\nSubtitle Options\\n\\n* Font familyDefault\\n* Font colorDefault\\n* Font opacityDefault\\n* Font sizeDefault\\n* Background colorDefault\\n* Background opacityDefault\\n* Window colorDefault\\n* Window opacityDefault\\n* Character edge styleDefault\\n\\nFont family\\n\\n* Default\\n* Monospaced Serif\\n* Proportional Serif\\n* Monospaced Sans-Serif\\n* Proportional Sans-Serif\\n\\nFont color\\n\\n* Default\\n* White\\n* Yellow\\n* Green\\n* Cyan\\n* Blue\\n* Magenta\\n* Red\\n* Black\\n\\nFont opacity\\n\\n* Default\\n* 25%\\n* 50%\\n* 75%\\n* 100%\\n\\nFont size\\n\\n* Default\\n* 50%\\n* 75%\\n* 100%\\n* 150%\\n* 200%\\n\\nBackground color\\n\\n* Default\\n* White\\n* Yellow\\n* Green\\n* Cyan\\n* Blue\\n* Magenta\\n* Red\\n* Black\\n\\nBackground opacity\\n\\n* Default\\n* 0%\\n* 25%\\n* 50%\\n* 75%\\n* 100%\\n\\nWindow color\\n\\n* Default\\n* White\\n* Yellow\\n* Green\\n* Cyan\\n* Blue\\n* Magenta\\n* Red\\n* Black\\n\\nWindow opacity\\n\\n* Default\\n* 0%\\n* 25%\\n* 50%\\n* 75%\\n* 100%\\n\\nCharacter edge style\\n\\n* Default\\n* None\\n* Drop Shadow\\n* Raised\\n* Depressed\\n* Uniform\\n\\nLoaded: 0%\\n\\n0:00\\n\\nProgress: 0%\\n\\n0:00\\n\\nProgress: 0%\\n\\nPlayPlayUnmuteUnmute\\n\\nCurrent Time 0:00\\n\\n\/\\n\\nDuration Time 0:00\\n\\nLive\\n\\nRemaining Time -0:00\\n\\nWatch in VRWatch in VR\\n\\n* , selecteddescriptions off\\n\\nDescriptions\\n\\nSubtitlesSubtitlesUnavailable\\n\\nUnavailableUnavailable\\n\\nUnavailableLanguageLanguageSettingsHDSettingsFullscreenFullscreen\\n\\nThis is a modal window.\\n\\nCaption Settings Dialog\\n\\nBeginning of dialog window. Escape will cancel and close the window.\\n\\nTextColorWhiteBlackRedGreenBlueYellowMagentaCyanTransparencyOpaqueSemi-Transparent\\n\\nBackgroundColorBlackWhiteRedGreenBlueYellowMagentaCyanTransparencyOpaqueSemi-TransparentTransparent\\n\\nWindowColorBlackWhiteRedGreenBlueYellowMagentaCyanTransparencyTransparentSemi-TransparentOpaque\\n\\nFont Size50%75%100%125%150%175%200%300%400%\\n\\nText Edge StyleNoneRaisedDepressedUniformDropshadow\\n\\nFont FamilyProportional Sans-SerifMonospace Sans-SerifProportional SerifMonospace SerifCasualScriptSmall Caps\\n\\nDefaultsDone\\n\\n* [Powered by THEOplayer 7.5.0](https:\/\/www.theoplayer.com\/player-referral)\\n \\n\\nClose Related Content\\n\\nClose Share\\n\\nOn November 19, 1863, at the dedication of a military cemetery at Gettysburg, [Pennsylvania](\/topics\/us-states\/pennsylvania)\\n, during the [American](\/topics\/american-civil-war)\\n [Civil War](\/topics\/american-civil-war\/american-civil-war-history)\\n, President [Abraham Lincoln](\/topics\/us-presidents\/abraham-lincoln)\\n delivers one of the most memorable speeches in American history. In fewer than 275 words, Lincoln brilliantly and movingly reminded a war-weary public why the Union had to fight, and win, the Civil War.\\n\\nThe [Battle of Gettysburg](\/topics\/american-civil-war\/battle-of-gettysburg)\\n, fought some four months earlier, was one of the single bloodiest battle of the Civil War. Over the course of three days, more than 45,000 men were killed, injured, captured or went missing. The battle also proved to be the turning point of the war: General Robert E. Lee\u2019s defeat and retreat from Gettysburg marked the last Confederate invasion of Northern territory and the beginning of the Southern army\u2019s ultimate decline.\\n\\nPlay Video\\n\\nLearn more\\n\\nRelated contentRelated contentShare VideoShare Video\\n\\nPlaying on\\n\\nSubtitles\\n\\nLanguage\\n\\nSettings\\n\\n* QualityAutomatic Automatic HD\\n* SpeedNormal\\n* SubtitleOptions\\n\\nQuality\\n\\n* Automatic\\n\\nSpeed\\n\\n* 0.25\\n* 0.5\\n* Normal\\n* 1.25\\n* 1.5\\n* 2\\n\\nSubtitle Options\\n\\n* Font familyDefault\\n* Font colorDefault\\n* Font opacityDefault\\n* Font sizeDefault\\n* Background colorDefault\\n* Background opacityDefault\\n* Window colorDefault\\n* Window opacityDefault\\n* Character edge styleDefault\\n\\nFont family\\n\\n* Default\\n* Monospaced Serif\\n* Proportional Serif\\n* Monospaced Sans-Serif\\n* Proportional Sans-Serif\\n\\nFont color\\n\\n* Default\\n* White\\n* Yellow\\n* Green\\n* Cyan\\n* Blue\\n* Magenta\\n* Red\\n* Black\\n\\nFont opacity\\n\\n* Default\\n* 25%\\n* 50%\\n* 75%\\n* 100%\\n\\nFont size\\n\\n* Default\\n* 50%\\n* 75%\\n* 100%\\n* 150%\\n* 200%\\n\\nBackground color\\n\\n* Default\\n* White\\n* Yellow\\n* Green\\n* Cyan\\n* Blue\\n* Magenta\\n* Red\\n* Black\\n\\nBackground opacity\\n\\n* Default\\n* 0%\\n* 25%\\n* 50%\\n* 75%\\n* 100%\\n\\nWindow color\\n\\n* Default\\n* White\\n* Yellow\\n* Green\\n* Cyan\\n* Blue\\n* Magenta\\n* Red\\n* Black\\n\\nWindow opacity\\n\\n* Default\\n* 0%\\n* 25%\\n* 50%\\n* 75%\\n* 100%\\n\\nCharacter edge style\\n\\n* Default\\n* None\\n* Drop Shadow\\n* Raised\\n* Depressed\\n* Uniform\\n\\nLoaded: 0%\\n\\n0:00\\n\\nProgress: 0%\\n\\n0:00\\n\\nProgress: 0%\\n\\nPausePauseUnmuteUnmute\\n\\nCurrent Time 0:00\\n\\n\/\\n\\nDuration Time 0:00\\n\\nLive\\n\\nRemaining Time -0:00\\n\\nWatch in VRWatch in VR\\n\\n* , selecteddescriptions off\\n\\nDescriptions\\n\\nSubtitlesSubtitlesUnavailable\\n\\nUnavailableUnavailable\\n\\nUnavailableLanguageLanguageSettingsHDSettingsFullscreenFullscreen\\n\\nThis is a modal window.\\n\\nCaption Settings Dialog\\n\\nBeginning of dialog window. Escape will cancel and close the window.\\n\\nTextColorWhiteBlackRedGreenBlueYellowMagentaCyanTransparencyOpaqueSemi-Transparent\\n\\nBackgroundColorBlackWhiteRedGreenBlueYellowMagentaCyanTransparencyOpaqueSemi-TransparentTransparent\\n\\nWindowColorBlackWhiteRedGreenBlueYellowMagentaCyanTransparencyTransparentSemi-TransparentOpaque\\n\\nFont Size50%75%100%125%150%175%200%300%400%\\n\\nText Edge StyleNoneRaisedDepressedUniformDropshadow\\n\\nFont FamilyProportional Sans-SerifMonospace Sans-SerifProportional SerifMonospace SerifCasualScriptSmall Caps\\n\\nDefaultsDone\\n\\n* [Powered by THEOplayer 7.5.0](https:\/\/www.theoplayer.com\/player-referral)\\n \\n\\nThe Gettysburg Address\\n\\nClose Related Content\\n\\nClose Share\\n\\nCharged by Pennsylvania\u2019s governor, Andrew Curtin, to care for the Gettysburg dead, an attorney named David Wills bought 17 acres of pasture to turn into a cemetery for the more than 7,500 who fell in battle. Wills invited Edward Everett, one of the most famous orators of the day, to deliver a speech at the cemetery\u2019s dedication. Almost as an afterthought, Wills also sent a letter to Lincoln\u2014just two weeks before the ceremony\u2014requesting \u201ca few appropriate remarks\u201d to consecrate the grounds.\\n\\nAt the dedication, the crowd listened for two hours to Everett before Lincoln spoke. Lincoln\u2019s address lasted just two or three minutes. The speech reflected his redefined belief that the Civil War was not just a fight to save the Union, but a struggle for freedom and equality for all, an idea Lincoln had not championed in the years leading up to the war.\\n\\nThis was his stirring conclusion: \u201cThe world will little note, nor long remember what we say here, but it can never forget what they did here. It is for us the living, rather, to be dedicated here to the unfinished work which they who fought here have thus far so nobly advanced. It is rather for us to be here dedicated to the great task remaining before us\u2014that from these honored dead we take increased devotion to that cause for which they gave the last full measure of devotion\u2014that we here highly resolve that these dead shall not have died in vain\u2014that this nation, under God, shall have a new birth of freedom\u2014and that government of the people, by the people, for the people, shall not perish from the earth.\u201d\\n\\nReception of Lincoln\u2019s Gettysburg Address was initially mixed, divided strictly along partisan lines. Nevertheless, the \u201clittle speech,\u201d as he later called it, is thought by many today to be the most eloquent articulation of the democratic vision ever written.\\n\\n[![Battle of Gettysburg](https:\/\/assets.editorial.aetnd.com\/uploads\/2019\/07\/battle-of-gettysburg-gettyimages-3090040-copy.jpg?width=3840&quality=75&auto=webp)](\/news\/battle-gettysburg-turning-point-civil-war)\\n\\n[How the Battle of Gettysburg Turned the Tide of the Civil War\\\\\\n-------------------------------------------------------------\\\\\\n\\\\\\nIn a must-win clash, Union forces halted the northern invasion of Robert E. Lee\u2019s Confederate Army.\\\\\\n\\\\\\nRead more](\/news\/battle-gettysburg-turning-point-civil-war)\\n\\n[![The Lincoln Memorial in Washington, D.C.](https:\/\/assets.editorial.aetnd.com\/uploads\/2013\/03\/gettyimages-486565700.jpg?width=3840&quality=75&auto=webp)](\/news\/gettysburg-address-facts)\\n\\n[8 Surprising Facts About the Gettysburg Address\\\\\\n-----------------------------------------------\\\\\\n\\\\\\nAbraham Lincoln\u2019s Civil War-era speech is one for the ages.\\\\\\n\\\\\\nRead more](\/news\/gettysburg-address-facts)\\n\\n[![Abraham Lincoln making his famous address.Abraham Lincoln making his famous address on 19 November 1863 at the dedication of the Soldiers' National Cemetery at Gettysburg on the site of the American Civil War battle with the greatest number of casualties. Lithograph. (Photo by: Photo12\/Universal Images Group via Getty Images)](https:\/\/www.history.com\/this-day-in-history\/Photo%20by:%20Photo12\/Universal%20Images%20Group%20via%20Getty%20Images)](\/news\/abraham-lincoln-famous-quotes-speeches)\\n\\n[Abraham Lincoln\u2019s Most Enduring Speeches and Quotes\\\\\\n---------------------------------------------------\\\\\\n\\\\\\nFrom soaring oratory like the Gettysburg Address to folksy, humorous yarns, Lincoln knew how to wield the power of words.\\\\\\n\\\\\\nRead more](\/news\/abraham-lincoln-famous-quotes-speeches)\\n\\nAlso on This Day in History November | 19\\n-----------------------------------------\\n\\n* * *\\n\\n![](https:\/\/www.history.com\/editorial\/_next\/image?url=https%3A%2F%2Fassets.editorial.aetnd.com%2Fhistory-article-default.desktop.jpg&w=3840&q=75)[2004](\/this-day-in-history\/year\/2004)\\n\\n### [NBA players and fans brawl at infamous \\\"Malice at the Palace\\\" game](\/this-day-in-history\/sports-brawls-nba-infamous)\\n\\n[Sports](\/topics\/sports)\\n\\n![](https:\/\/www.history.com\/editorial\/_next\/image?url=https%3A%2F%2Fassets.editorial.aetnd.com%2Fuploads%2F2012%2F05%2Fthis-day-in-history-11-19-1863-lincoln-gettysburg-address.jpg&w=3840&q=75)\\n\\n### [This Day in History Video: What Happened on November 19](\/this-day-in-history\/november-19-video)\\n\\n[U.S. Presidents](\/topics\/us-presidents)\\n\\n![](https:\/\/www.history.com\/editorial\/_next\/image?url=https%3A%2F%2Fassets.editorial.aetnd.com%2Fhistory-article-default.desktop.jpg&w=3840&q=75)[1942](\/this-day-in-history\/year\/1942)\\n\\n### [Soviets launch counterattack at Stalingrad](\/this-day-in-history\/soviet-counterattack-at-stalingrad)\\n\\n[World War II](\/topics\/world-war-ii)\\n\\n![](https:\/\/assets.editorial.aetnd.com\/uploads\/2024\/10\/GettyImages-594896582.jpg?width=3840&quality=75&auto=webp)\\n\\n### Wake Up to This Day in History\\n\\nSign up now to learn about This Day in History straight from your inbox. \\nGet all of today's events in just one email featuring a range of topics.\\n\\nSign Up\\n\\nBy submitting your information, you agree to receive emails from HISTORY and A+E Networks. You can opt out at any time. You must be 16 years or older and a resident of the United States.\\n\\n**More details**: [Privacy Notice](https:\/\/www.aenetworks.com\/privacy)\\n | [Terms of Use](https:\/\/www.aenetworks.com\/terms)\\n | [Contact Us](https:\/\/support.history.com\/)\\n\\n![](https:\/\/www.history.com\/editorial\/_next\/image?url=https%3A%2F%2Fassets.editorial.aetnd.com%2Fhistory-article-default.desktop.jpg&w=3840&q=75)[1969](\/this-day-in-history\/year\/1969)\\n\\n### [Soccer legend Pel\u00e9 scores 1,000th goal](\/this-day-in-history\/pele-scores-1000th-goal)\\n\\n[Sports](\/topics\/sports)\\n\\n![](https:\/\/www.history.com\/editorial\/_next\/image?url=https%3A%2F%2Fassets.editorial.aetnd.com%2Fhistory-article-default.desktop.jpg&w=3840&q=75)[2003](\/this-day-in-history\/year\/2003)\\n\\n### [An arrest warrant is issued for Michael Jackson](\/this-day-in-history\/an-arrest-warrant-is-issued-for-michael-jackson)\\n\\n[Art, Literature and Film History](\/topics\/art-history)\\n\\n![](https:\/\/www.history.com\/editorial\/_next\/image?url=https%3A%2F%2Fassets.editorial.aetnd.com%2Fhistory-article-default.desktop.jpg&w=3840&q=75)[1975](\/this-day-in-history\/year\/1975)\\n\\n### [\u201cOne Flew Over the Cuckoo\u2019s Nest\u201d opens in theaters](\/this-day-in-history\/one-flew-over-the-cuckoos-nest-debuts)\\n\\n[Art, Literature and Film History](\/topics\/art-history)\\n\\n![](https:\/\/www.history.com\/editorial\/_next\/image?url=https%3A%2F%2Fassets.editorial.aetnd.com%2Fhistory-article-default.desktop.jpg&w=3840&q=75)[1976](\/this-day-in-history\/year\/1976)\\n\\n### [Patty Hearst out on bail](\/this-day-in-history\/patty-hearst-out-on-bail)\\n\\n[Crime](\/topics\/crime)\\n\\n![](https:\/\/www.history.com\/editorial\/_next\/image?url=https%3A%2F%2Fassets.editorial.aetnd.com%2Fhistory-article-default.desktop.jpg&w=3840&q=75)[1985](\/this-day-in-history\/year\/1985)\\n\\n### [Reagan and Gorbachev hold their first summit meeting](\/this-day-in-history\/reagan-and-gorbachev-hold-their-first-summit-meeting)\\n\\n[Cold War](\/topics\/cold-war)\",\"metadata\":{\"title\":\"President Lincoln delivers Gettysburg Address | November 19, 1863 | HISTORY\",\"description\":\"On November 19, 1863, at the dedication of a military cemetery at Gettysburg, Pennsylvania, during the American Civil War, President Lincoln delivers one of the most famous speeches in American history: the Gettysburg Address.\",\"language\":\"en\",\"robots\":\"index, follow\",\"ogTitle\":\"President Lincoln delivers Gettysburg Address | November 19, 1863 | HISTORY\",\"ogDescription\":\"On November 19, 1863, at the dedication of a military cemetery at Gettysburg, Pennsylvania, during the American Civil War, President Lincoln delivers one of the most famous speeches in American history: the Gettysburg Address.\",\"ogUrl\":\"https:\/\/www.history.com\/this-day-in-history\/lincoln-delivers-gettysburg-address\",\"ogImage\":\"https:\/\/assets.editorial.aetnd.com\/uploads\/2012\/05\/this-day-in-history-11-19-1863-lincoln-gettysburg-address.jpg\",\"ogLocale\":\"en_US\",\"ogLocaleAlternate\":[],\"ogSiteName\":\"HISTORY\",\"og:date\":\"2010-03-10T14:27:52\",\"viewport\":\"width=device-width, initial-scale=1\",\"theme-color\":\"#000000\",\"msapplication-TileColor\":\"#1d428a\",\"og:locale\":\"en_US\",\"og:type\":\"article\",\"og:title\":\"President Lincoln delivers Gettysburg Address | November 19, 1863 | HISTORY\",\"og:description\":\"On November 19, 1863, at the dedication of a military cemetery at Gettysburg, Pennsylvania, during the American Civil War, President Lincoln delivers one of the most famous speeches in American history: the Gettysburg Address.\",\"og:url\":\"https:\/\/www.history.com\/this-day-in-history\/lincoln-delivers-gettysburg-address\",\"og:site_name\":\"HISTORY\",\"og:image\":\"https:\/\/assets.editorial.aetnd.com\/uploads\/2012\/05\/this-day-in-history-11-19-1863-lincoln-gettysburg-address.jpg\",\"og:image:secure_url\":\"https:\/\/assets.editorial.aetnd.com\/uploads\/2012\/05\/this-day-in-history-11-19-1863-lincoln-gettysburg-address.jpg\",\"og:image:width\":\"1024\",\"og:image:height\":\"576\",\"twitter:card\":\"summary_large_image\",\"twitter:description\":\"On November 19, 1863, at the dedication of a military cemetery at Gettysburg, Pennsylvania, during the American Civil War, President Lincoln delivers one of the most famous speeches in American history: the Gettysburg Address.\",\"twitter:image\":\"https:\/\/assets.editorial.aetnd.com\/uploads\/2012\/05\/this-day-in-history-11-19-1863-lincoln-gettysburg-address.jpg\",\"google-site-verification\":\"91CWuHRY6kFZq2UzVQsD1stdYEf2zriY8lTCLFzfOmk\",\"next-head-count\":\"27\",\"sourceURL\":\"https:\/\/www.history.com\/this-day-in-history\/lincoln-delivers-gettysburg-address\",\"statusCode\":200}}}" +} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-566ab17bb6275aec1c9b3987dfebd126.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-566ab17bb6275aec1c9b3987dfebd126.json new file mode 100644 index 0000000..69a9258 --- /dev/null +++ b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-566ab17bb6275aec1c9b3987dfebd126.json @@ -0,0 +1,9 @@ +{ + "statusCode": 200, + "headers": { + "access-control-allow-origin": "*", + "x-ratelimit-limit": "500", + "x-ratelimit-remaining": "499" + }, + "data": "{\"searchParameters\":{\"q\":\"\\\"American Civil War\\\" timeline 1861 \\\"Fort Sumter\\\" \\\"Bull Run\\\" \\\"Battle of Shiloh\\\" effects\",\"type\":\"search\",\"num\":10,\"engine\":\"google\"},\"organic\":[],\"credits\":1}" +} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-6569dc605a724876f77e71cee5a3192d.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-6569dc605a724876f77e71cee5a3192d.json new file mode 100644 index 0000000..271cb6f --- /dev/null +++ b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-6569dc605a724876f77e71cee5a3192d.json @@ -0,0 +1,8 @@ +{ + "statusCode": 200, + "headers": { + "access-control-allow-origin": "*", + "x-ratelimit-limit": "500" + }, + "data": "{\"searchParameters\":{\"q\":\"American Civil War summary timeline, Battle of Gettysburg 1863, General Grant's leadership, Sherman's March to the Sea, Confederate General Lee's surrender at Appomattox Court House 1865, post-war Reconstruction\",\"type\":\"search\",\"num\":10,\"engine\":\"google\"},\"organic\":[{\"title\":\"Civil War Timeline - Gettysburg National Military Park (U.S. National ...\",\"link\":\"https://www.nps.gov/gett/learn/historyculture/civil-war-timeline.htm\",\"snippet\":\"It was here that US General Ulysses S. Grant gained his nickname \\\"Unconditional Surrender\\\" Grant. February 22, 1862- Jefferson Davis is inaugurated as President ...\",\"position\":1},{\"title\":\"Appomattox Court House - American Battlefield Trust\",\"link\":\"https://www.battlefields.org/learn/civil-war/battles/appomattox-court-house\",\"snippet\":\"Trapped by the Federals near Appomattox Court House, Confederate general Robert E. Lee surrendered his army to Union general Ulysses S. Grant.\",\"attributes\":{\"Missing\":\"1863, Reconstruction\"},\"position\":2},{\"title\":\"American Civil War | Timeline | Britannica\",\"link\":\"https://www.britannica.com/summary/American-Civil-War-Timeline\",\"snippet\":\"May\u2013July 1863 ... In the western theater of the war, General Ulysses S. Grant lays siege to the Confederate stronghold of Vicksburg, Mississippi. The Confederates ...\",\"attributes\":{\"Missing\":\"leadership, Reconstruction\"},\"position\":3},{\"title\":\"Civil War Timeline | American Battlefield Trust\",\"link\":\"https://www.battlefields.org/learn/articles/day-civil-war\",\"snippet\":\"Explore our timeline of the American Civil War and learn about the important events and battles that happened throughout this period of American history.\",\"date\":\"Feb 3, 2010\",\"position\":4},{\"title\":\"1863 | Civil War Glass Negatives and Related Prints\",\"link\":\"https://www.loc.gov/collections/civil-war-glass-negatives/articles-and-essays/time-line-of-the-civil-war/1863/\",\"snippet\":\"The Gettysburg Campaign\u200b\u200b Confederate General Lee decided to take the war to the enemy. On June 13, he defeated Union forces at Winchester, Virginia, and ...\",\"attributes\":{\"Missing\":\"leadership, Sea, Appomattox Court House Reconstruction\"},\"position\":5},{\"title\":\"Major Battles and Campaigns of the Civil War - American History\",\"link\":\"https://guides.lib.jjay.cuny.edu/c.php?g=288398&p=4496547\",\"snippet\":\"Fought on April 9 1865, the final battle between the forces of General Ulysses Grant and General Robert E Lee was the Battle of Appomattox Court ...\",\"date\":\"Sep 30, 2024\",\"position\":6},{\"title\":\"American Civil War - Wikipedia\",\"link\":\"https://en.wikipedia.org/wiki/American_Civil_War\",\"snippet\":\"The Confederates abandoned Richmond, and on April 9, 1865, Lee surrendered to Grant following the Battle of Appomattox Court House, setting in motion the end of ...\",\"position\":7},{\"title\":\"Sherman's March to the Sea | Significance, Map, Casualties, & The ...\",\"link\":\"https://www.britannica.com/topic/Shermans-March-to-the-Sea\",\"snippet\":\"The war effectively ended in April 1865 when Confederate General Robert E. Lee surrendered his troops to Union General Ulysses S. Grant at ...\",\"date\":\"5 days ago\",\"position\":8},{\"title\":\"Civil War Overview\",\"link\":\"https://www.civilwar.com/overview/timeline-18354/148542-civil-war-overview.html\",\"snippet\":\"This summary, organized yearly through maps and chronologies, shows the course of the war from Fort Sumter in 1861 to Appomattox Court House and beyond in 1865.\",\"position\":9},{\"title\":\"[PDF] American History What Was the Biggest Turning Point of the Civil ...\",\"link\":\"https://www.trumanlibrary.gov/public/Election1864-Material.pdf\",\"snippet\":\"Sherman's March to the Sea. -. The focus of Sherman's March was to destroy the Confederacy's capacity to make war. Railroads were a major target for Sherman.\",\"position\":10}],\"peopleAlsoAsk\":[{\"question\":\"What was the Civil War summary?\",\"snippet\":\"The Civil War was America's bloodiest and most divisive conflict, pitting the Union Army against the Confederate States of America. The war resulted in the deaths of more than 620,000 people, with millions more injured and the South left in ruins.\",\"title\":\"American Civil War: Causes, Dates & Battles | HISTORY\",\"link\":\"https://www.history.com/topics/american-civil-war\"},{\"question\":\"What 10 events happened in the Civil War?\",\"snippet\":\"SIGNIFICANT CIVIL WAR BATTLES\\nApril 12, 1861: Battle of Fort Sumter. ...\\nJune 30, 1861: Battle of Philippi. ...\\nJuly 21, 1861: First Battle of Bull Run/First Battle of Manassas. ...\\nAugust 28-29, 1861: Battle of Hatteras Inlet Batteries. ...\\nOctober 21, 1861: Battle of Ball's Bluff. ...\\nNovember 7, 1861: Battle of Belmont.\",\"title\":\"Significant Civil War Battles | American Experience - PBS\",\"link\":\"https://www.pbs.org/wgbh/americanexperience/features/timeline-death/\"},{\"question\":\"When was the American Civil War timeline?\",\"snippet\":\"The American Civil War (April 12, 1861 \u2013 May 26, 1865; also known by other names) was a civil war in the United States between the Union (\\\"the North\\\") and the Confederacy (\\\"the South\\\"), which was formed in 1861 by states that had seceded from the Union.\",\"title\":\"American Civil War - Wikipedia\",\"link\":\"https://en.wikipedia.org/wiki/American_Civil_War\"},{\"question\":\"What happened in 1863 during the Civil War?\",\"snippet\":\"1863. January 1, 1863- The Emancipation Proclamation goes into effect. The Emancipation Proclamation was a war measure that declared enslaved people in rebelling states to be free, authorized the enlistment of black troops, and outraged white Southerners.\",\"title\":\"Civil War Timeline - Gettysburg National Military Park (U.S. National ...\",\"link\":\"https://www.nps.gov/gett/learn/historyculture/civil-war-timeline.htm\"}],\"relatedSearches\":[{\"query\":\"Civil War Timeline 1861 To 1865\"},{\"query\":\"Who won the Civil War\"},{\"query\":\"When did the Civil War start and end\"},{\"query\":\"When did the Civil War end\"},{\"query\":\"Civil War battles in order\"},{\"query\":\"What was the first battle of the Civil War\"},{\"query\":\"what general led the confederate army into pennsylvania?\"},{\"query\":\"Where did the Civil War take place\"}],\"credits\":1}" +} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-c94f9a735104da2fd9c0c44ea1ed1ba1.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-c94f9a735104da2fd9c0c44ea1ed1ba1.json new file mode 100644 index 0000000..6ea1f41 --- /dev/null +++ b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-c94f9a735104da2fd9c0c44ea1ed1ba1.json @@ -0,0 +1,8 @@ +{ + "statusCode": 200, + "headers": { + "access-control-allow-origin": "*", + "x-ratelimit-limit": "500" + }, + "data": "{\"searchParameters\":{\"q\":\"Significance of Gettysburg Address 1863, impact on American Civil War\",\"type\":\"search\",\"num\":10,\"engine\":\"google\"},\"answerBox\":{\"snippet\":\"Without mentioning words like \u201cConfederacy,\u201d \u201cslavery,\u201d or \u201csecession\u201d in the Gettysburg Address, Lincoln broadened the objectives of the Civil War to include not just preserving the Union as it was (with slavery largely intact in the South), but also achieving \u201ca new birth of freedom\u201d that would abolish slavery and, ...\",\"title\":\"The Civil War: Lincoln and the Gettysburg Address\",\"link\":\"https:\/\/www.gilderlehrman.org\/sites\/default\/files\/Unit6_Complete_CivilWar_0.pdf\"},\"organic\":[{\"title\":\"President Lincoln delivers Gettysburg Address | November 19, 1863\",\"link\":\"https:\/\/www.history.com\/this-day-in-history\/lincoln-delivers-gettysburg-address\",\"snippet\":\"The speech reflected his redefined belief that the Civil War was not just a fight to save the Union, but a struggle for freedom and equality for ...\",\"date\":\"Mar 10, 2010\",\"position\":1},{\"title\":\"The Gettysburg Address (1863) - The National Constitution Center\",\"link\":\"https:\/\/constitutioncenter.org\/the-constitution\/historic-document-library\/detail\/abraham-lincoln-the-gettysburg-address-1863\",\"snippet\":\"The Union victory at Gettysburg was a key moment in the Civil War\u2014thwarting General Robert E. Lee's invasion of the North. President Lincoln offered this brief ...\",\"position\":2},{\"title\":\"The Gettysburg Address \u2011 Definition, Meaning & Purpose | HISTORY\",\"link\":\"https:\/\/www.history.com\/topics\/american-civil-war\/gettysburg-address\",\"snippet\":\"In it, he invoked the principles of human equality contained in the Declaration of Independence and connected the sacrifices of the Civil War ...\",\"date\":\"Aug 24, 2010\",\"sitelinks\":[{\"title\":\"Gettysburg Address: Lincoln's...\",\"link\":\"https:\/\/www.history.com\/topics\/american-civil-war\/gettysburg-address#section_2\"},{\"title\":\"The Historic Gettysburg Address\",\"link\":\"https:\/\/www.history.com\/topics\/american-civil-war\/gettysburg-address#section_3\"}],\"position\":3},{\"title\":\"Gettysburg Address \u2013 Engage All Abilities\",\"link\":\"https:\/\/depts.washington.edu\/particip\/2019\/05\/06\/gettysburg-address\/\",\"snippet\":\"It added moral force to the Union cause and was a significant milestone leading to the ratification of the 13th Amendment to the Constitution in ...\",\"date\":\"May 6, 2019\",\"position\":4},{\"title\":\"Gettysburg Address Definition, Summary & Significance - Lesson\",\"link\":\"https:\/\/study.com\/academy\/lesson\/gettysburg-address-summary-analysis.html\",\"snippet\":\"The Gettysburg Address's significance is that it sought to give meaning to the sacrifice of soldiers who died during the war.\",\"position\":5},{\"title\":\"Gettysburg Battle Facts and Summary - American Battlefield Trust\",\"link\":\"https:\/\/www.battlefields.org\/learn\/civil-war\/battles\/gettysburg\",\"snippet\":\"Gettysburg ended Confederate general Robert E. Lee's ambitious second quest to invade the North and bring the Civil War to a swift end. The loss there dashed ...\",\"position\":6},{\"title\":\"The Gettysburg Address, 1863\",\"link\":\"https:\/\/www.gilderlehrman.org\/history-resources\/spotlight-primary-source\/gettysburg-address-1863\",\"snippet\":\"Lincoln's three-minute-long Gettysburg Address defined the meaning of the Civil War. Drawing upon the biblical concepts of suffering, consecration, and ...\",\"position\":7},{\"title\":\"Gettysburg Address | Abraham Lincoln Presidential Library and ...\",\"link\":\"https:\/\/presidentlincoln.illinois.gov\/visit\/whats-inside\/exhibits\/online-exhibits\/gettysburg-address-everett-copy\/\",\"snippet\":\"Lincoln is saying the Civil War is not just about the United States's future but is a test of whether any nation built on the promise of liberty and equality ...\",\"position\":8},{\"title\":\"Today in History - November 19 | Library of Congress\",\"link\":\"https:\/\/www.loc.gov\/item\/today-in-history\/november-19\/\",\"snippet\":\"On November 19, 1863, President Abraham Lincoln delivered a short speech at the close of ceremonies dedicating the battlefield cemetery at Gettysburg, ...\",\"date\":\"Nov 19, 2023\",\"position\":9}],\"peopleAlsoAsk\":[{\"question\":\"What impact did the Gettysburg Address have on the Civil War?\",\"snippet\":\"In his address, President Lincoln invoked the Declaration of Independence, and its principles of liberty and equality, and spoke of \u201ca new birth of freedom\u201d for the nation. He continued to reshape the aims of the war for the American people-transforming it from a war for Union to a war for Union and freedom.\\nMay 6, 2019\",\"title\":\"Gettysburg Address \u2013 Engage All Abilities\",\"link\":\"https:\/\/depts.washington.edu\/particip\/2019\/05\/06\/gettysburg-address\/\"},{\"question\":\"What was Gettysburg impact on the Civil War?\",\"snippet\":\"Union victory. Gettysburg ended Confederate general Robert E. Lee's ambitious second quest to invade the North and bring the Civil War to a swift end. The loss there dashed the hopes of the Confederate States of America to become an independent nation.\",\"title\":\"Gettysburg Battle Facts and Summary - American Battlefield Trust\",\"link\":\"https:\/\/www.battlefields.org\/learn\/civil-war\/battles\/gettysburg\"},{\"question\":\"What was the significance of the Gettysburg Address for slavery?\",\"snippet\":\"The speech was a turning point in his war strategy in that, for the first time, he began to openly speak of the abolition of slavery as a desired outcome of the war, a \\\"new birth of freedom.\\\" The mural above depicts an allegory of emancipation in the center.\",\"title\":\"Lincoln Memorial: Emancipation & Gettysburg Address\",\"link\":\"https:\/\/www.nps.gov\/places\/000\/lincoln-memorial-emancipation-gettysburg-address.htm\"},{\"question\":\"What was the significance of the Civil War in 1863?\",\"snippet\":\"On January 1, 1863, Abraham Lincoln issued the final Emancipation Proclamation, which declared that all slaves within the rebellious states \u201care, and henceforward shall be free.\u201d Bitterly denounced in the South\u2014and by many in the North\u2014the Proclamation reduced the likelihood that the anti-slavery European powers would ...\",\"title\":\"December 1862\u2013October 1863 - The Civil War in America | Exhibitions\",\"link\":\"https:\/\/www.loc.gov\/exhibits\/civil-war-in-america\/december-1862-october-1863.html\"}],\"relatedSearches\":[{\"query\":\"How did the Gettysburg Address impact the Civil War\"},{\"query\":\"Why was the Gettysburg Address important\"},{\"query\":\"Why is the Gettysburg Address important today\"},{\"query\":\"What was the purpose of the Gettysburg Address\"},{\"query\":\"Gettysburg Address text\"},{\"query\":\"Gettysburg Address meaning line by line\"},{\"query\":\"Gettysburg Address summary\"},{\"query\":\"Who was the audience of the Gettysburg Address\"}],\"credits\":1}" +} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-d4bf31054d2e78fbc5e45673b16c9a89.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-d4bf31054d2e78fbc5e45673b16c9a89.json new file mode 100644 index 0000000..7c3930c --- /dev/null +++ b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-d4bf31054d2e78fbc5e45673b16c9a89.json @@ -0,0 +1,8 @@ +{ + "statusCode": 200, + "headers": { + "access-control-allow-origin": "*", + "x-ratelimit-limit": "500" + }, + "data": "{\"searchParameters\":{\"q\":\"American Civil War 1862 key events Emancipation Proclamation and Battle of Antietam\",\"type\":\"search\",\"num\":10,\"engine\":\"google\"},\"answerBox\":{\"snippet\":\"On Sept. 22, 1862, President Abraham Lincoln changed the course of American history by announcing that enslaved people would soon be free. Commonly referred to as the 'preliminary' Emancipation Proclamation, Lincoln's action that day was emboldened by a Union victory at the Battle of Antietam only days earlier.\",\"snippetHighlighted\":[\"Sept.\",\"22, 1862, President Abraham Lincoln changed the course of American history by announcing that enslaved people would soon be free\"],\"title\":\"160 years later: Remembering the Battle of Antietam and the ...\",\"link\":\"https:\/\/www.georgiasouthern.edu\/news\/2022\/09\/27\/160-years-later-remembering-the-battle-of-antietam-and-the-preliminary-emancipation-proclamation-that-reshaped-american-history\/\",\"date\":\"Sep 27, 2022\"},\"organic\":[{\"title\":\"Antietam Battle Facts and Summary | American Battlefield Trust\",\"link\":\"https:\/\/www.battlefields.org\/learn\/civil-war\/battles\/antietam\",\"snippet\":\"Antietam, the deadliest one-day battle in American military history, showed that the Union could stand against the Confederate army in the Eastern theater.\",\"position\":1},{\"title\":\"American Civil War - Battle of Antietam, Emancipation Proclamation ...\",\"link\":\"https:\/\/www.britannica.com\/event\/American-Civil-War\/The-war-in-1862\",\"snippet\":\"The year 1862 marked a major turning point in the war, especially the war in the East, as Lee took command of the Confederate army.\",\"date\":\"Oct 11, 2024\",\"position\":2},{\"title\":\"1862 | Civil War Glass Negatives and Related Prints\",\"link\":\"https:\/\/www.loc.gov\/collections\/civil-war-glass-negatives\/articles-and-essays\/time-line-of-the-civil-war\/1862\/\",\"snippet\":\"On January 27, President Lincoln issued a war order authorizing the Union to launch a unified aggressive action against the Confederacy.\",\"position\":3},{\"title\":\"Civil War Timeline - Gettysburg National Military Park (U.S. National ...\",\"link\":\"https:\/\/www.nps.gov\/gett\/learn\/historyculture\/civil-war-timeline.htm\",\"snippet\":\"September 22, 1862- Following the US victory at Antietam, President Lincoln introduces the Preliminary Emancipation Proclamation, which announced Lincoln's ...\",\"position\":4},{\"title\":\"Emancipation Proclamation (1863) - National Archives\",\"link\":\"https:\/\/www.archives.gov\/milestone-documents\/emancipation-proclamation\",\"snippet\":\"President Abraham Lincoln issued the Emancipation Proclamation on January 1, 1863, announcing, \\\"that all persons held as slaves\\\" within the rebellious areas \\\" ...\",\"date\":\"May 10, 2022\",\"position\":5},{\"title\":\"Emancipation Proclamation \u2011 Definition, Dates & Summary | HISTORY\",\"link\":\"https:\/\/www.history.com\/topics\/american-civil-war\/emancipation-proclamation\",\"snippet\":\"On September 22, 1862, President Abraham Lincoln issued the preliminary Emancipation Proclamation, which declared that as of January 1, 1863, all enslaved ...\",\"date\":\"Oct 29, 2009\",\"position\":6},{\"title\":\"Timeline | Abraham Lincoln and Emancipation | Articles and Essays\",\"link\":\"https:\/\/www.loc.gov\/collections\/abraham-lincoln-papers\/articles-and-essays\/abraham-lincoln-and-emancipation\/timeline\/\",\"snippet\":\"1862, Sept.\u200b\u200b President Lincoln issued the Preliminary Emancipation Proclamation, declaring that as of January 1, 1863 \\\"all persons held as slaves within any ...\",\"position\":7},{\"title\":\"Freedom at Antietam - National Park Service\",\"link\":\"https:\/\/www.nps.gov\/anti\/learn\/historyculture\/freedom-at-antietam.htm\",\"snippet\":\"Five days after the battle, armed with pen and paper, Abraham Lincoln changed the war when he issued the Emancipation Proclamation. The ...\",\"date\":\"Sep 15, 2023\",\"position\":8},{\"title\":\"7 Ways the Battle of Antietam Changed America | HISTORY\",\"link\":\"https:\/\/www.history.com\/news\/7-ways-the-battle-of-antietam-changed-america\",\"snippet\":\"The battle allowed Abraham Lincoln to issue the Emancipation Proclamation. For two months, Lincoln's order proclaiming the freedom of enslaved ...\",\"date\":\"Sep 14, 2012\",\"position\":9}],\"peopleAlsoAsk\":[{\"question\":\"What was the Battle of Antietam and Emancipation Proclamation?\",\"snippet\":\"As the glowing sun set over the bloody fields of Antietam, the Civil War became a different war. Five days after the battle, armed with pen and paper, Abraham Lincoln changed the war when he issued the Emancipation Proclamation. The proclamation reflected Lincoln's new way of thinking about the conflict.\\nSep 15, 2023\",\"title\":\"Freedom at Antietam - National Park Service\",\"link\":\"https:\/\/www.nps.gov\/anti\/learn\/historyculture\/freedom-at-antietam.htm\"},{\"question\":\"What key events happened in the Antietam Battle?\",\"snippet\":\"September 17. The Battle of Antietam begins at dawn when Hooker's Union corps mounts a powerful assault on Lee's left flank. Repeated Union attacks and equally vicious Confederate counterattacks sweep back and forth across Miller's cornfield and the West Woods.\",\"title\":\"Antietam Battle Facts and Summary | American Battlefield Trust\",\"link\":\"https:\/\/www.battlefields.org\/learn\/civil-war\/battles\/antietam\"},{\"question\":\"What three events happened in 1862 civil war?\",\"snippet\":\"1862\\nJanuary 1862. Abraham Lincoln Takes Action. ...\\nMarch 1862. McClellan Loses Command. ...\\nApril 1862. The Battle of Shiloh. ...\\nApril 1862. New Orleans. ...\\nApril 1862. The Peninsular Campaign. ...\\nMay 1862. \\\"Stonewall\\\" Jackson Defeats Union Forces. ...\\nJune 1862. The Battle of Seven Pines (Fair Oaks) ...\\nJuly 1862. The Seven Days' Battles.\",\"title\":\"1862 | Civil War Glass Negatives and Related Prints\",\"link\":\"https:\/\/www.loc.gov\/collections\/civil-war-glass-negatives\/articles-and-essays\/time-line-of-the-civil-war\/1862\/\"},{\"question\":\"What happened at the Battle of Antietam in 1862?\",\"snippet\":\"The Battle of Antietam ended the Confederate Army of Northern Virginia's first invasion into the North and led Abraham Lincoln to issue the preliminary Emancipation Proclamation.\",\"title\":\"Antietam National Battlefield (U.S. National Park Service)\",\"link\":\"https:\/\/www.nps.gov\/ancm\/\"}],\"relatedSearches\":[{\"query\":\"Who won the Battle of Antietam\"},{\"query\":\"1862 Civil War Timeline\"},{\"query\":\"1862 Civil War Battle\"},{\"query\":\"Where was the Battle of Antietam\"},{\"query\":\"Why was the Battle of Antietam important\"},{\"query\":\"What happened in 1862 in American History\"},{\"query\":\"Battle of Antietam casualties\"},{\"query\":\"When did the Battle of Antietam end\"}],\"credits\":1}" +} diff --git a/tests/Fixtures/Saloon/AgentChains/RatAgentChain-0dac52efdcd81f0dae4be83cc7dd9134.json b/tests/Fixtures/Saloon/AgentChains/RatAgentChain-0dac52efdcd81f0dae4be83cc7dd9134.json deleted file mode 100644 index c0b7531..0000000 --- a/tests/Fixtures/Saloon/AgentChains/RatAgentChain-0dac52efdcd81f0dae4be83cc7dd9134.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Thu, 17 Oct 2024 01:56:08 GMT", - "Content-Type": "application\/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AJA25VaNBB4t2ZMS8lc44qZO7WB9x\",\n \"object\": \"chat.completion\",\n \"created\": 1729130161,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"paragraphs\\\": [\\n \\\"Improving heart health is a multifaceted endeavor that includes lifestyle changes and medical strategies. First and foremost, diet plays a critical role in heart health. Reducing the intake of saturated fats, trans fats, and cholesterol-rich foods is advisable, as these can contribute to plaque buildup in arteries. Instead, focus on eating a variety of fruits, vegetables, whole grains, and lean proteins to keep your heart healthy.\\\",\\n \\\"Regular physical activity is also crucial for maintaining a healthy heart. Aim for at least 150 minutes of moderate aerobic exercise or 75 minutes of vigorous exercise each week, combined with muscle-strengthening activities on two or more days a week.\\\",\\n \\\"Avoiding tobacco in any form is one of the most significant steps you can take to protect your heart. Smoking and the use of tobacco products increase the risk of developing cardiovascular diseases. If you smoke, seek help to quit as soon as possible.\\\",\\n \\\"Monitoring your health with regular check-ups can help catch and address potential heart issues before they become severe. This includes keeping an eye on blood pressure, cholesterol levels, and blood sugar, especially if you have a family history of heart disease. Lastly, managing stress and ensuring adequate sleep each night contribute to overall heart health. Engage in stress-reducing activities that you enjoy and aim for 7-9 hours of sleep per night to promote heart health.\\\"\\n ]\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 381,\n \"completion_tokens\": 294,\n \"total_tokens\": 675,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/AgentChains/RatAgentChain-23b86031e4743be2f58c64dd85d11f40.json b/tests/Fixtures/Saloon/AgentChains/RatAgentChain-23b86031e4743be2f58c64dd85d11f40.json deleted file mode 100644 index a430148..0000000 --- a/tests/Fixtures/Saloon/AgentChains/RatAgentChain-23b86031e4743be2f58c64dd85d11f40.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:27:52 GMT", - "Content-Type": "application\/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "6899", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999844", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "4ms", - "x-request-id": "req_fd9e16fe1d41d69704c264020d6ae42d", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=cSkNNrqiYZL3V1thOKDP5jrTIIk37edj.kGz89SszVg-1729560472-1.0.1.1-op2FlAkf5QMH6IhEYgQhsLOg4LHxseuhdpHwjiOul.3ZEybv_F_bpORQIiTK5ufJdO.pBGsZOOTWxRk0ImZmDw; path=\/; expires=Tue, 22-Oct-24 01:57:52 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=XPTKjmKQYCUkhuhErTbb8MlVyfHpmVTb_B9VZBRGZpk-1729560472549-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b4ed6c8c4245-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKxyTO57jKrY1c8OP8tpx6inpsw8K\",\n \"object\": \"chat.completion\",\n \"created\": 1729560465,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Improving heart health is a multifaceted approach involving diet, exercise, lifestyle choices, and monitoring health metrics. \\n\\nFirstly, focusing on a healthy diet is crucial. Aim to incorporate plenty of fruits, vegetables, whole grains, and lean proteins into your daily meals. Reduce intake of saturated fats, trans fats, and cholesterol to help decrease blood pressure and improve lipid profiles. Consider also reducing salt and sugar, which particularly benefit heart health by lowering blood pressure and reducing the risk of cardiovascular disease. \\n\\nSecondly, regular physical activity is essential. The American Heart Association recommends at least 150 minutes of moderate aerobic exercise, or 75 minutes of vigorous exercise, each week. This can include activities like walking, jogging, cycling, or swimming. Regular exercise helps maintain a healthy weight, lowers blood pressure, improves circulation, and strengthens the heart muscle.\\n\\nThirdly, lifestyle modifications play a significant role. If you smoke, quitting is perhaps the most significant step you can take to protect your cardiovascular health. Limiting alcohol consumption and managing stress through techniques like meditation, deep breathing exercises, or yoga can also positively impact heart health.\\n\\nLastly, it\u2019s important to monitor your health through regular check-ups with your doctor. This includes checking your blood pressure, cholesterol levels, and other pertinent heart-related metrics. If you have a family history of heart disease, these check-ups become even more critical as they can help catch potential issues early.\\n\\nBy integrating these practices into your life, you can significantly enhance your heart health and reduce the risk of heart diseases.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 116,\n \"completion_tokens\": 320,\n \"total_tokens\": 436,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/AgentChains/RatAgentChain-3a4abc7b397c195a952d147f5999c932.json b/tests/Fixtures/Saloon/AgentChains/RatAgentChain-3a4abc7b397c195a952d147f5999c932.json deleted file mode 100644 index a4719f0..0000000 --- a/tests/Fixtures/Saloon/AgentChains/RatAgentChain-3a4abc7b397c195a952d147f5999c932.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:28:20 GMT", - "Content-Type": "application\/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "8876", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999396", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "18ms", - "x-request-id": "req_840559461212cf82d64cbd4b1ae04559", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=RjU4dU2ruXhZ.6WQLXLzA2tsCP7dIYLjNISOHvuD30U-1729560500-1.0.1.1-HuXR5QvzxbScL5RSZkfMGW4fY8oI8UJ.Ury0mBkYicFLO0cCkh2OdT9AkuxvJ8.DnLFZimkZrejysKIGWLhjTQ; path=\/; expires=Tue, 22-Oct-24 01:58:20 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=bJWdtNemdE6f8qGUAEvHMdvlubcWuPjg8QZADZZONfc-1729560500635-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b590ccd642e7-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKxytzFzQVlilr4h8iF847NpkL9Qs\",\n \"object\": \"chat.completion\",\n \"created\": 1729560491,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"paragraphs\\\": [\\n \\\"Improving heart health is crucial and can be achieved through a combination of diet, exercise, lifestyle adjustments, and regular medical check-ups. Firstly, diet plays a fundamental role in heart health. Incorporating a variety of fruits, vegetables, whole grains, and lean proteins into your diet helps manage weight and lowers the risk of heart disease. It is also important to minimize the intake of saturated fats, trans fats, excess sodium, and sugars, all of which can negatively impact heart health.\\\",\\n \\\"Secondly, exercise is essential for maintaining a healthy heart. Aim for at least 150 minutes of moderate aerobic activity or 75 minutes of vigorous activity per week, as recommended by health organizations like the American Heart Association. Regular physical activity not only strengthens the heart but also helps control weight, reduces arterial stiffness, and improves overall cardiovascular endurance.\\\",\\n \\\"Thirdly, lifestyle changes are vital for heart health. Quitting smoking and reducing alcohol intake are top priorities, as both have been linked to heart disease. Additionally, managing stress through mindfulness, meditation, or yoga can positively affect your heart health by reducing stress hormones and inflammation.\\\",\\n \\\"Finally, regular health check-ups are indispensable for maintaining heart health. These check-ups help monitor blood pressure, cholesterol levels, and other heart-related indicators, allowing for early detection and management of potential health issues. By integrating these strategies into your daily life, you can significantly enhance your cardiac function and overall heart health, leading to a longer, healthier life.\\\"\\n ]\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 440,\n \"completion_tokens\": 309,\n \"total_tokens\": 749,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/AgentChains/RatAgentChain-3d6768be2549ac5e1a0e44d2ed1eb2c1.json b/tests/Fixtures/Saloon/AgentChains/RatAgentChain-3d6768be2549ac5e1a0e44d2ed1eb2c1.json deleted file mode 100644 index a5372fd..0000000 --- a/tests/Fixtures/Saloon/AgentChains/RatAgentChain-3d6768be2549ac5e1a0e44d2ed1eb2c1.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:28:02 GMT", - "Content-Type": "application\/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "9568", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999293", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "21ms", - "x-request-id": "req_52ff88b78eb40f3aa93b4ff53e50d77a", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=VC3i2ik2t3JGhiVxi8O.UBz_n5KpT0eGWyr09uk.cdM-1729560482-1.0.1.1-jYw8Cz2T9Z2UcV8M4w2dViD.D2kaihil8Qf69PpoY6J4pbAR0rmQIZOWAHTXKxEMhZqUZ5eiv6OwKJRr8bK4cA; path=\/; expires=Tue, 22-Oct-24 01:58:02 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=EFrlVOrrRA4uHwjqALJbB7M2hCZPTU_wOydaH17Hxdw-1729560482546-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b51b5d2e43dd-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKxyblN6CbCJCwiPpb13BChH8TgHQ\",\n \"object\": \"chat.completion\",\n \"created\": 1729560473,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Improving heart health involves a combination of diet, exercise, lifestyle choices, and regular medical check-ups. \\n\\nFirstly, adjusting your diet is a key factor in boosting heart health. Incorporate a variety of fruits, vegetables, and whole grains into your meals. Focus on eating lean proteins and limit your intake of unhealthy fats, sodium, and added sugars. This approach can help manage your body weight, reduce cholesterol, and lower blood pressure, all of which are beneficial for heart health.\\n\\nSecondly, exercise is crucial for maintaining a healthy heart. The American Heart Association recommends at least 150 minutes of moderate-intensity aerobic exercise, or 75 minutes of vigorous exercise per week. Regular physical activity helps strengthen the heart muscle, improves blood circulation, and can help you maintain a healthy weight.\\n\\nAdditionally, lifestyle modifications are necessary for optimal heart health. If you smoke, quitting is one of the most powerful steps you can take. Managing stress through techniques like yoga, meditation, or regular relaxation can also have profound benefits on your cardiovascular health. Limiting alcohol intake is recommended as it can have a direct impact on heart conditions.\\n\\nLastly, routine health screenings are vital. Regular visits to your healthcare provider for blood pressure, cholesterol, and diabetes screenings can help detect problems early and facilitate timely intervention. Discussing your family's health history with your doctor can also provide insights into your personal risk factors and guide preventive measures.\\n\\nBy implementing these strategies, you can improve your heart health significantly and decrease the risk of heart-related diseases.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 525,\n \"completion_tokens\": 314,\n \"total_tokens\": 839,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/AgentChains/RatAgentChain-7e62e7ca508c58a7dd52e9451a68d9b2.json b/tests/Fixtures/Saloon/AgentChains/RatAgentChain-7e62e7ca508c58a7dd52e9451a68d9b2.json deleted file mode 100644 index 6d6dd98..0000000 --- a/tests/Fixtures/Saloon/AgentChains/RatAgentChain-7e62e7ca508c58a7dd52e9451a68d9b2.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:28:11 GMT", - "Content-Type": "application/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "8222", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1998750", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "37ms", - "x-request-id": "req_eb79e82455779172b64cf352d1fcd0ba", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=pthxdFvkAVee_uTckkTmSScEXcueUclhCP26WPMAGlI-1729560491-1.0.1.1-r_SOEF1Xfv22ckOB79QM.bk9YcAvHFxsW5hC14NnclNDLwa5LaURig3B7QldesktEoUplk4YKJrvk6BWLIS5Ew; path=/; expires=Tue, 22-Oct-24 01:58:11 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=1RlVzYSrZzPIaOYAp0rMVbchRSinWkZR_Wf8Dt.N1O0-1729560491210-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b559ebfb8cec-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKxyl6kWTV5RgXszK4gabSDHNO7eh\",\n \"object\": \"chat.completion\",\n \"created\": 1729560483,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Improving heart health is crucial and can be achieved through a combination of diet, exercise, lifestyle adjustments, and regular medical check-ups. \\\\n\\\\nFirstly, diet plays a fundamental role in heart health. Incorporating a variety of fruits, vegetables, whole grains, and lean proteins into your diet helps manage weight and lowers the risk of heart disease. It is also important to minimize the intake of saturated fats, trans fats, excess sodium, and sugars, all of which can negatively impact heart health. \\\\n\\\\nSecondly, exercise is essential for maintaining a healthy heart. Aim for at least 150 minutes of moderate aerobic activity or 75 minutes of vigorous activity per week, as recommended by health organizations like the American Heart Association. Regular physical activity not only strengthens the heart but also helps control weight, reduces arterial stiffness, and improves overall cardiovascular endurance. \\\\n\\\\nThirdly, lifestyle changes are vital for heart health. Quitting smoking and reducing alcohol intake are top priorities, as both have been linked to heart disease. Additionally, managing stress through mindfulness, meditation, or yoga can positively affect your heart health by reducing stress hormones and inflammation. \\\\n\\\\nFinally, regular health check-ups are indispensable for maintaining heart health. These check-ups help monitor blood pressure, cholesterol levels, and other heart-related indicators, allowing for early detection and management of potential health issues. \\\\n\\\\nBy integrating these strategies into your daily life, you can significantly enhance your cardiac function and overall heart health, leading to a longer, healthier life.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 928,\n \"completion_tokens\": 317,\n \"total_tokens\": 1245,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/AgentChains/RatAgentChain-9ce86b41e54066cf052469d1d46c848d.json b/tests/Fixtures/Saloon/AgentChains/RatAgentChain-9ce86b41e54066cf052469d1d46c848d.json deleted file mode 100644 index ede9289..0000000 --- a/tests/Fixtures/Saloon/AgentChains/RatAgentChain-9ce86b41e54066cf052469d1d46c848d.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Thu, 17 Oct 2024 01:51:50 GMT", - "Content-Type": "application/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AJ9xp1Dm5MRjmPh5TsT1gZUsvvbBF\",\n \"object\": \"chat.completion\",\n \"created\": 1729129897,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Improving heart health is a multifaceted endeavor that includes lifestyle changes and medical strategies. First and foremost, diet plays a critical role in heart health. Reducing the intake of saturated fats, trans fats, and cholesterol-rich foods is advisable, as these can contribute to plaque buildup in arteries. Instead, focus on eating a variety of fruits, vegetables, whole grains, and lean proteins to keep your heart healthy.\\\\n\\\\nRegular physical activity is also crucial for maintaining a healthy heart. Aim for at least 150 minutes of moderate aerobic exercise or 75 minutes of vigorous exercise each week, combined with muscle-strengthening activities on two or more days a week. Avoiding tobacco in any form is one of the most significant steps you can take to protect your heart. Smoking and the use of tobacco products increase the risk of developing cardiovascular diseases. If you smoke, seek help to quit as soon as possible.\\\\n\\\\nMonitoring your health with regular check-ups can help catch and address potential heart issues before they become severe. This includes keeping an eye on blood pressure, cholesterol levels, and blood sugar, especially if you have a family history of heart disease. Lastly, managing stress and ensuring adequate sleep each night contribute to overall heart health. Engage in stress-reducing activities that you enjoy and aim for 7-9 hours of sleep per night to promote heart health.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 364,\n \"completion_tokens\": 287,\n \"total_tokens\": 651,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/AgentChains/RatAgentChain-c8b871f5b66ceee6cdd6a4f41ca4809e.json b/tests/Fixtures/Saloon/AgentChains/RatAgentChain-c8b871f5b66ceee6cdd6a4f41ca4809e.json deleted file mode 100644 index 0d8758f..0000000 --- a/tests/Fixtures/Saloon/AgentChains/RatAgentChain-c8b871f5b66ceee6cdd6a4f41ca4809e.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Thu, 17 Oct 2024 01:50:28 GMT", - "Content-Type": "application\/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AJ9wZnNOMYPTf1cGDenfRqL1FZVs8\",\n \"object\": \"chat.completion\",\n \"created\": 1729129819,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Improving heart health is a multifaceted endeavor that includes lifestyle changes and medical strategies. First and foremost, diet plays a critical role in heart health. Reducing the intake of saturated fats, trans fats, and cholesterol-rich foods is advisable, as these can contribute to plaque buildup in arteries. Instead, focus on eating a variety of fruits, vegetables, whole grains, and lean proteins to keep your heart healthy.\\\\n\\\\nRegular physical activity is also crucial for maintaining a healthy heart. Aim for at least 150 minutes of moderate aerobic exercise or 75 minutes of vigorous exercise each week, combined with muscle-strengthening activities on two or more days a week.\\\\n\\\\nAvoiding tobacco in any form is one of the most significant steps you can take to protect your heart. Smoking and the use of tobacco products increase the risk of developing cardiovascular diseases. If you smoke, seek help to quit as soon as possible.\\\\n\\\\nMonitoring your health with regular check-ups can help catch and address potential heart issues before they become severe. This includes keeping an eye on blood pressure, cholesterol levels, and blood sugar, especially if you have a family history of heart disease.\\\\n\\\\nLastly, managing stress and ensuring adequate sleep each night contribute to overall heart health. Engage in stress-reducing activities that you enjoy and aim for 7-9 hours of sleep per night to promote heart health.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 145,\n \"completion_tokens\": 291,\n \"total_tokens\": 436,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/AgentChains/RatAgentChain-e6be3b2a969ae75116175e3c039cc2f2.json b/tests/Fixtures/Saloon/AgentChains/RatAgentChain-e6be3b2a969ae75116175e3c039cc2f2.json deleted file mode 100644 index 89a5763..0000000 --- a/tests/Fixtures/Saloon/AgentChains/RatAgentChain-e6be3b2a969ae75116175e3c039cc2f2.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Thu, 17 Oct 2024 01:50:18 GMT", - "Content-Type": "application\/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID" - }, - "data": "{\n \"id\": \"chatcmpl-AJ9wS3DmlVd0DuHRikV5zpDZekJLG\",\n \"object\": \"chat.completion\",\n \"created\": 1729129812,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Improving heart health is a significant concern for maintaining overall well-being and can be achieved through a combination of lifestyle changes, dietary adjustments, and regular medical check-ups. \\n\\nFirstly, engaging in regular physical activity is one of the most effective ways to strengthen the heart. Aim for at least 150 minutes of moderate aerobic exercise or 75 minutes of vigorous exercise each week. Activities could include walking, cycling, swimming, or sprinting. Exercise helps reduce hypertension, lower cholesterol, and keep body weight under control.\\n\\nSecondly, diet plays a crucial role in heart health. Incorporating heart-healthy foods into your diet can enhance cardiovascular function and reduce risk factors. Focus on eating a variety of fruits and vegetables, whole grains, lean proteins such as fish and legumes, and nuts and seeds. Limit the intake of saturated fats, trans fats, cholesterol, salt (sodium), and added sugars. Opt for cooking methods that require less fat, such as boiling, baking, or steaming rather than frying.\\n\\nAdditionally, managing stress and ensuring adequate sleep each night are vital components of heart health. Chronic stress and poor sleep patterns can lead to increased heart rate and blood pressure, potentially causing long-term harm to the heart. Employ relaxation techniques such as meditation, deep breathing exercises, or yoga. Strive for 7-9 hours of quality sleep per night.\\n\\nRegularly monitoring health metrics and consulting with healthcare professionals are also crucial. Keep track of your blood pressure, cholesterol levels, and body weight. Regular check-ups will help in early identification and management of any potential heart issues. Quitting smoking and limiting alcohol intake are also beneficial for maintaining a healthy heart.\\n\\nBy consistently applying these strategies, you can significantly improve and maintain your heart health over time.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 81,\n \"completion_tokens\": 362,\n \"total_tokens\": 443,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-9ae29f2ff260a200c78e895234990b88.json b/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-9ae29f2ff260a200c78e895234990b88.json new file mode 100644 index 0000000..7d8a3dd --- /dev/null +++ b/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-9ae29f2ff260a200c78e895234990b88.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Thu, 24 Oct 2024 01:33:41 GMT", + "Content-Type": "application\/json", + "Content-Length": "515", + "Connection": "keep-alive" + }, + "data": "{\"id\":\"msg_016sUkaDosKYyTYiwnDqJq6v\",\"type\":\"message\",\"role\":\"assistant\",\"model\":\"claude-3-5-sonnet-20240620\",\"content\":[{\"type\":\"text\",\"text\":\"{\\n \\\"answer\\\": \\\"The current president of the United States is Joe Biden. He is the 46th president, having taken office in 2021. Biden previously served as the 47th Vice President and represented Delaware in the U.S. Senate for 36 years before becoming president.\\\"\\n}\"}],\"stop_reason\":\"end_turn\",\"stop_sequence\":null,\"usage\":{\"input_tokens\":1847,\"output_tokens\":68}}" +} diff --git a/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-c31fbf2a429a96687e99c3b94fd406f3.json b/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-c31fbf2a429a96687e99c3b94fd406f3.json new file mode 100644 index 0000000..8a15af2 --- /dev/null +++ b/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-c31fbf2a429a96687e99c3b94fd406f3.json @@ -0,0 +1,9 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Thu, 24 Oct 2024 01:33:40 GMT", + "Content-Type": "application\/json", + "Content-Length": "688" + }, + "data": "{\"id\":\"msg_01Rf1cmavyQXHwrTKuRBDpwt\",\"type\":\"message\",\"role\":\"assistant\",\"model\":\"claude-3-5-sonnet-20240620\",\"content\":[{\"type\":\"text\",\"text\":\"Based on the search results, I can provide you with the information about the current president of the United States:\\n\\n```json\\n{\\n \\\"answer\\\": \\\"The current president of the United States is Joe Biden. He is the 46th and current president, having taken office in 2021. Joe Biden previously served as the 47th Vice President of the United States and represented Delaware in the U.S. Senate for 36 years before becoming president.\\\"\\n}\\n```\"}],\"stop_reason\":\"end_turn\",\"stop_sequence\":null,\"usage\":{\"input_tokens\":1648,\"output_tokens\":104}}" +} diff --git a/tests/Fixtures/Saloon/Integrations/OllamaToolTestAgent-dd3c1226bcfb52db4cac0fc3cd00f4f0.json b/tests/Fixtures/Saloon/Integrations/OllamaToolTestAgent-dd3c1226bcfb52db4cac0fc3cd00f4f0.json new file mode 100644 index 0000000..7de4de3 --- /dev/null +++ b/tests/Fixtures/Saloon/Integrations/OllamaToolTestAgent-dd3c1226bcfb52db4cac0fc3cd00f4f0.json @@ -0,0 +1,9 @@ +{ + "statusCode": 200, + "headers": { + "Content-Type": "application\/json; charset=utf-8", + "Date": "Thu, 24 Oct 2024 01:34:12 GMT", + "Content-Length": "376" + }, + "data": "{\"model\":\"llama3.2\",\"created_at\":\"2024-10-24T01:34:12.828517139Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\\"answer\\\": \\\"Joe Biden is the current President of the United States.\\\"}\"},\"done_reason\":\"stop\",\"done\":true,\"total_duration\":30057119000,\"load_duration\":2077610548,\"prompt_eval_count\":1061,\"prompt_eval_duration\":26605401000,\"eval_count\":17,\"eval_duration\":1199741000}" +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Integrations/OpenAiToolTestAgent-75c161b01e340522e8715d4c26443fa9.json b/tests/Fixtures/Saloon/Integrations/OpenAiToolTestAgent-75c161b01e340522e8715d4c26443fa9.json new file mode 100644 index 0000000..51d7285 --- /dev/null +++ b/tests/Fixtures/Saloon/Integrations/OpenAiToolTestAgent-75c161b01e340522e8715d4c26443fa9.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Thu, 24 Oct 2024 01:34:14 GMT", + "Content-Type": "application\/json", + "Content-Length": "676", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-ALh1qLnFxQ7etMVx5Urpmd4TCuMTH\",\n \"object\": \"chat.completion\",\n \"created\": 1729733654,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Joe Biden\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1119,\n \"completion_tokens\": 15,\n \"total_tokens\": 1134,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_ed14c08274\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Tools/SerperTestAgent-f7bf86866f50c4d6aa1c3352ff0b6f8c.json b/tests/Fixtures/Saloon/Tools/SerperTestAgent-f7bf86866f50c4d6aa1c3352ff0b6f8c.json new file mode 100644 index 0000000..5e75921 --- /dev/null +++ b/tests/Fixtures/Saloon/Tools/SerperTestAgent-f7bf86866f50c4d6aa1c3352ff0b6f8c.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Thu, 24 Oct 2024 01:34:23 GMT", + "Content-Type": "application\/json", + "Content-Length": "674", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-ALh1yZ5j6xTEBEKFVf3GSWKOTiPdq\",\n \"object\": \"chat.completion\",\n \"created\": 1729733662,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Joe Biden\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 321,\n \"completion_tokens\": 15,\n \"total_tokens\": 336,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" +} diff --git a/tests/Integrations/ClaudeIntegrationTest.php b/tests/Integrations/ClaudeIntegrationTest.php index b3b33fa..edaec0f 100644 --- a/tests/Integrations/ClaudeIntegrationTest.php +++ b/tests/Integrations/ClaudeIntegrationTest.php @@ -2,23 +2,23 @@ declare(strict_types=1); - use Saloon\Http\Faking\Fixture; - use Saloon\Http\Faking\MockClient; - use Saloon\Http\Faking\MockResponse; - use Saloon\Http\PendingRequest; - use UseTheFork\Synapse\Agent; - use UseTheFork\Synapse\Contracts\Agent\HasIntegration; - use UseTheFork\Synapse\Contracts\Integration; - use UseTheFork\Synapse\Contracts\Memory; - use UseTheFork\Synapse\Integrations\ClaudeIntegration; - use UseTheFork\Synapse\Integrations\Connectors\Claude\Requests\ChatRequest; - use UseTheFork\Synapse\Memory\CollectionMemory; - use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; - use UseTheFork\Synapse\Tools\Search\SerperTool; - use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; - use UseTheFork\Synapse\ValueObject\SchemaRule; - - test('Connects', function (): void { + use Saloon\Http\Faking\Fixture; + use Saloon\Http\Faking\MockClient; + use Saloon\Http\Faking\MockResponse; + use Saloon\Http\PendingRequest; + use UseTheFork\Synapse\Agent; + use UseTheFork\Synapse\Contracts\Agent\HasIntegration; + use UseTheFork\Synapse\Contracts\Integration; + use UseTheFork\Synapse\Contracts\Memory; + use UseTheFork\Synapse\Integrations\ClaudeIntegration; + use UseTheFork\Synapse\Integrations\Connectors\Claude\Requests\ChatRequest; + use UseTheFork\Synapse\Memory\CollectionMemory; + use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; + use UseTheFork\Synapse\Tools\Search\SerperTool; + use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; + use UseTheFork\Synapse\ValueObject\SchemaRule; + + test('Connects', function (): void { class ClaudeTestAgent extends Agent implements HasIntegration { @@ -106,5 +106,5 @@ protected function resolveTools(): array expect($agentResponseArray['content'])->toBeArray() ->and($agentResponseArray['content'])->toHaveKey('answer') - ->and($agentResponseArray['content']['answer'])->toContain('The current president of the United States is Joe Biden. He is the 46th president of the United States and took office in 2021. Joe Biden previously served as the 47th Vice President of the United States and represented Delaware in the US Senate for 36 years before becoming president.'); + ->and($agentResponseArray['content']['answer'])->toContain('The current president of the United States is Joe Biden. He is the 46th president, having taken office in 2021.'); }); diff --git a/tests/Integrations/OllamaIntegrationTest.php b/tests/Integrations/OllamaIntegrationTest.php index 9fbdeb3..d3769f3 100644 --- a/tests/Integrations/OllamaIntegrationTest.php +++ b/tests/Integrations/OllamaIntegrationTest.php @@ -2,21 +2,21 @@ declare(strict_types=1); - use Saloon\Http\Faking\Fixture; - use Saloon\Http\Faking\MockClient; - use Saloon\Http\Faking\MockResponse; - use Saloon\Http\PendingRequest; - use UseTheFork\Synapse\Agent; - use UseTheFork\Synapse\Contracts\Agent\HasIntegration; - use UseTheFork\Synapse\Contracts\Integration; - use UseTheFork\Synapse\Integrations\Connectors\Ollama\Requests\ChatRequest; - use UseTheFork\Synapse\Integrations\OllamaIntegration; - use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; - use UseTheFork\Synapse\Tools\Search\SerperTool; - use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; - use UseTheFork\Synapse\ValueObject\SchemaRule; - - test('Connects', function (): void { +use Saloon\Http\Faking\Fixture; +use Saloon\Http\Faking\MockClient; +use Saloon\Http\Faking\MockResponse; +use Saloon\Http\PendingRequest; +use UseTheFork\Synapse\Agent; +use UseTheFork\Synapse\Contracts\Agent\HasIntegration; +use UseTheFork\Synapse\Contracts\Integration; +use UseTheFork\Synapse\Integrations\Connectors\Ollama\Requests\ChatRequest; +use UseTheFork\Synapse\Integrations\OllamaIntegration; +use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; +use UseTheFork\Synapse\Tools\Search\SerperTool; +use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; +use UseTheFork\Synapse\ValueObject\SchemaRule; + +test('Connects', function (): void { class OllamaTestAgent extends Agent implements HasIntegration { @@ -106,5 +106,5 @@ protected function resolveTools(): array expect($agentResponseArray['content'])->toBeArray() ->and($agentResponseArray['content'])->toHaveKey('answer') - ->and($agentResponseArray['content']['answer'])->toBe('The current President of the United States is Joe Biden.'); + ->and($agentResponseArray['content']['answer'])->toBe('Joe Biden is the current President of the United States.'); }); diff --git a/tests/Integrations/OpenAiIntegrationTest.php b/tests/Integrations/OpenAiIntegrationTest.php index 4900af9..61444b2 100644 --- a/tests/Integrations/OpenAiIntegrationTest.php +++ b/tests/Integrations/OpenAiIntegrationTest.php @@ -2,22 +2,22 @@ declare(strict_types=1); - use Saloon\Http\Faking\Fixture; - use Saloon\Http\Faking\MockClient; - use Saloon\Http\Faking\MockResponse; - use Saloon\Http\PendingRequest; - use UseTheFork\Synapse\Agent; - use UseTheFork\Synapse\Contracts\Agent\HasIntegration; - use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; - use UseTheFork\Synapse\Contracts\Integration; - use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; - use UseTheFork\Synapse\Integrations\OpenAIIntegration; - use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; - use UseTheFork\Synapse\Tools\Search\SerperTool; - use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; - use UseTheFork\Synapse\ValueObject\SchemaRule; - - test('Connects with out resolveIntegration', function (): void { +use Saloon\Http\Faking\Fixture; +use Saloon\Http\Faking\MockClient; +use Saloon\Http\Faking\MockResponse; +use Saloon\Http\PendingRequest; +use UseTheFork\Synapse\Agent; +use UseTheFork\Synapse\Contracts\Agent\HasIntegration; +use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; +use UseTheFork\Synapse\Contracts\Integration; +use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; +use UseTheFork\Synapse\Integrations\OpenAIIntegration; +use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; +use UseTheFork\Synapse\Tools\Search\SerperTool; +use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; +use UseTheFork\Synapse\ValueObject\SchemaRule; + +test('Connects with out resolveIntegration', function (): void { class OpenAiWithOutResolveTestAgent extends Agent implements HasOutputSchema { @@ -136,5 +136,5 @@ protected function resolveTools(): array expect($agentResponseArray['content'])->toBeArray() ->and($agentResponseArray['content'])->toHaveKey('answer') - ->and($agentResponseArray['content']['answer'])->toBe('Joe Biden is the current President of the United States.'); + ->and($agentResponseArray['content']['answer'])->toBe('Joe Biden'); }); From a68c9ab3104a4e5bf5116173e82bd9ec59ce777c Mon Sep 17 00:00:00 2001 From: use-the-fork Date: Fri, 25 Oct 2024 20:17:52 -0400 Subject: [PATCH 4/7] refactor(agent/task): simplify task iteration management and response handling - Removed `currentIteration` from `PendingAgentTask` and refactored related methods to use direct properties. - Introduced `getPromptChain`, `getResponse`, and `setResponse` methods in `PendingAgentTask`. - Added `addToolCall` method for managing tool calls. - Updated `ChatRequest`, `Agent`, and various integration files to use the new methods and properties. - Improved clarity and maintainability of task completion logic across the codebase. --- src/Agent.php | 22 +- src/AgentTask/PendingAgentTask.php | 68 ++-- src/Integrations/ClaudeIntegration.php | 6 +- .../OpenAI/Requests/ChatRequest.php | 36 +- src/Integrations/OllamaIntegration.php | 6 +- src/Integrations/OpenAIIntegration.php | 40 +-- src/Traits/Agent/ValidatesOutputSchema.php | 335 +++++++++--------- tests/Fixtures/OpenAi/OpenAiFixture.php | 19 + ...hain-1490b8772b2bf708d3727e1fd1e12414.json | 10 - ...hain-2a0fcbb75e327652be2126fa648bd3e7.json | 10 - ...hain-47261d97210e865ca4818128f63d6926.json | 10 - ...hain-475d90e301668292a051dde550aee5a3.json | 11 - ...hain-72d3babdd785f7230e988f2e032f473d.json | 10 - ...hain-bc0c986806c46d9aa119053ac316b3ce.json | 10 - ...hain-d5c8e692581754f3aac57899f4c2603f.json | 10 - ...hain-ebe56fdb70a6f5dc2640a5e4b73366bc.json | 10 - ...hain-f709b10afe10f8e52425993b58e251a0.json | 10 - ...hain-ff5f3fc0f8a597f498ab55b7f934f5f1.json | 10 - ...Tool-073fd35020257fc589393e63f7775273.json | 8 - ...Tool-7b2933b3fa7351d076f3f06764a92c50.json | 8 - ...Tool-a08c0ae23dd3be2864787728bf4e74c4.json | 8 - ...Tool-566ab17bb6275aec1c9b3987dfebd126.json | 9 - ...Tool-6569dc605a724876f77e71cee5a3192d.json | 8 - ...Tool-c94f9a735104da2fd9c0c44ea1ed1ba1.json | 8 - ...Tool-d4bf31054d2e78fbc5e45673b16c9a89.json | 8 - ...gent-a4f1718f3bd597aaa73aabb90ccb115b.json | 10 - ...gent-d53f1768c34d5c32774aa924150302a0.json | 31 -- ...gent-d64a50cbac93e15e519fe16f1c1e212f.json | 31 -- ...ContextualRetrievalPreprocessingAgent.json | 31 -- .../Saloon/Agents/ImageAgentTestAgent.json | 31 -- ...gent-6a3bece603a588c169c067f3b13d3f04.json | 10 - ...gent-d54e72acfb8432e3c4ce48cab4f69391.json | 31 -- ...gent-09920d4481a4771ce866d0c345e25a91.json | 10 - ...gent-0b0867cd35d40e15c4e6ee69e34045b9.json | 10 - ...gent-0f2cbb046d14f10babf198d5839a56ee.json | 31 -- ...gent-1ba56f98ec619524c9cc046a17ce54c0.json | 10 - ...gent-1f623066a9197d1a4b395fa6a7079da3.json | 31 -- ...gent-2065af6d3f057153a11772603ec65f5e.json | 10 - ...gent-58b2f699ebef4cb1ebebf4221b228d5e.json | 14 - ...gent-6991437c545f65d770fa0188d82516ce.json | 10 - ...gent-aea323a5832b8415f679133f693e2b13.json | 31 -- ...gent-ca35aaabff5f4b53409aa9635246f84a.json | 10 - ...gent-dbbeef79e6e45bbca928834e33282bd5.json | 31 -- ...gent-df626a1c7b4955432c0bc96cdbffe38f.json | 31 -- ...gent-f31398b834b15382e7ad551a39889dd7.json | 9 - ...isan-0619d6097b2a0bb5bfb6ef58d9dec10a.json | 31 -- ...isan-a1d524092dba5bbe9f4a0bb7e0b9f909.json | 10 - ...isan-c1496a59f5142396d808855025edb586.json | 10 - ...isan-d04b51b713a0ff18d2779ed7991fbc0b.json | 31 -- ...gent-0b01a311e346b7ad882115c9bdbd879c.json | 10 - ...gent-2384f5379c63d4a79106a90e25db0613.json | 10 - ...gent-9e4ad814794b1055d28d99c79ff01b37.json | 10 - .../ClaudeTestAgent-Serper-Tool.json | 17 +- ...gent-f53d2674b3ae26af9917b35b24751e4e.json | 10 - .../Saloon/Integrations/ClaudeTestAgent.json | 14 +- ...gent-0700e950a65562155bd8920325b51181.json | 10 + ...gent-652ecfbf9539e59a6fd65d11f1a2fba2.json | 10 - ...gent-74cc9ac7d39fc2dbb068a35c3b4154a8.json | 10 + ...gent-9ae29f2ff260a200c78e895234990b88.json | 10 - ...gent-9e4ad814794b1055d28d99c79ff01b37.json | 16 +- ...gent-c31fbf2a429a96687e99c3b94fd406f3.json | 9 - ...gent-e6ed7a42ff9b7106aa22db121275e575.json | 10 - .../OllamaTestAgent-Serper-Tool.json | 12 +- ...gent-d8f986e1f1fc626f7d0d10b0fd2ba58f.json | 6 +- ...gent-73a9b9db662176ac0a3ed17dec715886.json | 9 - ...gent-c0527b86cfc080fa4aaa3255dd06edfc.json | 16 +- ...gent-dd3c1226bcfb52db4cac0fc3cd00f4f0.json | 9 - ...gent-f1744f93cad29395237a8874e3527b0d.json | 9 + .../Saloon/Integrations/OpenAiTestAgent.json | 23 +- ...gent-4715cf69359c579bd0b0aaebdb3cfe92.json | 27 ++ ...gent-75c161b01e340522e8715d4c26443fa9.json | 10 - ...gent-8c4de06e2a7064e26c30dd1131e7c149.json | 25 +- .../OpenAiToolTestAgent-Serper-Tool.json | 10 +- ...gent-e0903793a2fa24d5a334f52b3d9b46c6.json | 10 - .../OpenAiWithOutResolveTestAgent.json | 21 +- ...mory-71950ab35a36f639488c5a8c74463d53.json | 10 - ...mory-8cefaea3e899f6f2489b3487aa0a040d.json | 31 -- ...mory-d14909a03783ba5b88f3dea252a1f37a.json | 10 - ...mory-fe703367aa1f98d7884652612a3c77a6.json | 31 -- ...gent-2f7d9367ae0a307240ca69cc079676ea.json | 10 - ...gent-5e1fafee7be3b90f42757e4e40abcea4.json | 31 -- ...gent-6ca314ac196be36057a2a956836a6d8d.json | 31 -- ...gent-6ebf9da45af10a1c751df604f61ca011.json | 10 - ...gent-88c99971ec0d20928a13254ec24d91e8.json | 31 -- ...gent-a5508037a2c8a381d8b9556e70d91322.json | 10 - ...gent-bd12160cf0d4298d6b5dc4e13ae5a14d.json | 31 -- ...gent-ed9122f08b49da7ee73e6f97b414cde2.json | 10 - ...gent-efd20736544ba41f5fe46cb57dd7102e.json | 10 - ...gent-f35bc9bf07dc805cedb1cbda219d7a63.json | 31 -- ...gent-f36a2b79c2417f34329f24e826de8bce.json | 10 - ...gent-36440b3fabab462e10a0388479c20807.json | 10 - ...gent-47c33ba83a48790e1c7369c546e364d1.json | 10 - ...gent-4dd943e799ab1c294682801edb307f4e.json | 10 - ...gent-840fbdc622785ce8eaf6265ec38b373a.json | 10 - ...gent-991e3ebf644dfe01a68fc39669e07299.json | 10 - ...Tool-37a6259cc0c1dae299a7866489dff0bd.json | 10 - ...gent-b906c3b4c8019936fe115e4e62d3994c.json | 10 - ...gent-de2f99ba9fd74f13849ee043bcee4bdf.json | 10 - ...gent-ee890dab1469e9a09f9960cb3f09bf6d.json | 10 - ...mory-495ba0207bd93966fcb5547c5509fadb.json | 31 -- ...mory-ccd0a3decc142cdd6d28fc823fb70573.json | 10 - ...mory-d14909a03783ba5b88f3dea252a1f37a.json | 10 - ...mory-fe703367aa1f98d7884652612a3c77a6.json | 31 -- ...Tool-16d091022a41b3b3ba0ece72a85fd909.json | 27 ++ ...Tool-41fce475054295b2a2d1473d04f7aa9c.json | 9 - ...Tool-46246d8bf1cf8981b79398408f1c9374.json | 10 - ...Tool-4844006bb7346a8cd4946135a26bb2f2.json | 31 -- ...Tool-503bf8fd461d39c783d3b774fa78b28f.json | 18 +- .../Tools/ClearbitCompanyTool-Tool.json | 15 +- ...Tool-45750ef652ddceeaa4b56a6798ccee02.json | 10 - ...Tool-527a61c765676b4729099512e1a42e6a.json | 18 +- ...Tool-53741f3dfe7c8ca47ce535174669b15d.json | 27 ++ ...Tool-91330c935ee3c0271e4611b376117ea7.json | 31 -- ...Tool-94745683d5f8f1ed70612a5c036d54bf.json | 10 - .../Saloon/Tools/CrunchbaseTool-Tool.json | 4 +- ...Tool-43bcd63cc9d9b98eb8488d0e1a4c4174.json | 33 +- ...Tool-76cdcfb02f44fe52a23d1c7248cd0cae.json | 14 - ...Tool-9670841841d278662b0bb2ecc61c6f68.json | 27 ++ .../Saloon/Tools/FirecrawlTool-Tool.json | 5 +- ...gent-16ade5c7afd2bc82237a2c2c38ac43da.json | 10 - ...gent-17f20fbcbd7ad04b632e81d68f84cf54.json | 10 - ...gent-3e0f0fd702de589714e68a3b90a2ac15.json | 31 -- ...gent-4bee15d63dcfd3b54ef6f5e689b0d57e.json | 10 - ...gent-4c3078626dcfa6950ae2eb9ae69d71d9.json | 10 - ...gent-5c0d5e203062af04810663fcedb6fcee.json | 10 - ...gent-61990bddb088570835ac9679ebff1a34.json | 10 - ...gent-69088b2ddcf517d967507def8d0bc9e9.json | 31 -- ...gent-6c936275667473da519c385ffd4d808c.json | 10 - ...gent-78ec69527dda312ef75dea8aa1f07271.json | 10 - ...gent-abf1d4c9a9f535c0fbcb9eff86e94f08.json | 31 -- ...gent-e3b7bce01bc7df21e79bf8c5c7fbf744.json | 31 -- ...gent-e8159268c7e07a723f5966bd56d71812.json | 31 -- ...gent-fd2cd6d73785dc8bae6e230fd57c4dd7.json | 14 - ...Tool-3ca51b450f65fd56079ce1db68405384.json | 31 -- ...Tool-8b5a265c43dea6f4ed40a3d21bd13bf1.json | 31 -- ...Tool-937c344a3cba8d7375b74873e978e987.json | 30 -- ...Tool-9aaf34285a5c2c42a794174131d55815.json | 30 -- .../Tools/SerpAPIGoogleNewsTool-Tool.json | 26 -- ...Tool-cfec9d7d5277386c7e0255e1ca7e2d1e.json | 31 -- ...Tool-30b3c5e13ad916219ec1fbbc2983cb19.json | 10 - ...Tool-4d9c37b83db9353afd0462b60417eb0e.json | 9 - ...Tool-8c4de06e2a7064e26c30dd1131e7c149.json | 31 -- .../Tools/SerpAPIGoogleSearchTool-Tool.json | 10 - ...Tool-aabcdc9cde285aa6d7d0dd01b03c7b1c.json | 31 -- tests/Fixtures/Saloon/Tools/Serper-Tool.json | 16 +- ...gent-28125624c9418e220ffb104b593f9f20.json | 31 -- ...gent-39474d616ece521a51e916ab18d5ff87.json | 9 - ...gent-4d9c37b83db9353afd0462b60417eb0e.json | 9 - ...gent-8c4de06e2a7064e26c30dd1131e7c149.json | 18 +- ...gent-9e49a87ac181a72a979874028f1f6034.json | 27 ++ ...gent-f7bf86866f50c4d6aa1c3352ff0b6f8c.json | 10 - ...gent-15f86e44009e468d98a2182a922488fc.json | 10 - ...gent-391e03d399bbd1bfda18308c0ddfd184.json | 10 - ...gent-39bc17d178807a04cb3b9318f2573b99.json | 10 - ...gent-3ad8cdc0143898a9c2715861e2e3b459.json | 10 - ...gent-78b21fef39089d0fc8f6d5fa86f6b943.json | 10 - ...gent-7df97c9fde0e54abd5268b1e4fa76fca.json | 10 - ...gent-e71e66e0e81b0a350fd4cc375719fc88.json | 10 - tests/Integrations/ClaudeIntegrationTest.php | 2 +- tests/Integrations/OllamaIntegrationTest.php | 34 +- tests/Integrations/OpenAiIntegrationTest.php | 7 +- tests/Tools/ClearbitCompanyToolTest.php | 9 +- tests/Tools/CrunchbaseToolTest.php | 9 +- tests/Tools/FirecrawlToolTest.php | 48 ++- tests/Tools/SerperToolTest.php | 43 +-- 165 files changed, 693 insertions(+), 2444 deletions(-) create mode 100644 tests/Fixtures/OpenAi/OpenAiFixture.php delete mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-1490b8772b2bf708d3727e1fd1e12414.json delete mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-2a0fcbb75e327652be2126fa648bd3e7.json delete mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-47261d97210e865ca4818128f63d6926.json delete mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-475d90e301668292a051dde550aee5a3.json delete mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-72d3babdd785f7230e988f2e032f473d.json delete mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-bc0c986806c46d9aa119053ac316b3ce.json delete mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-d5c8e692581754f3aac57899f4c2603f.json delete mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-ebe56fdb70a6f5dc2640a5e4b73366bc.json delete mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-f709b10afe10f8e52425993b58e251a0.json delete mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-ff5f3fc0f8a597f498ab55b7f934f5f1.json delete mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainFirecrawlTool-073fd35020257fc589393e63f7775273.json delete mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainFirecrawlTool-7b2933b3fa7351d076f3f06764a92c50.json delete mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainFirecrawlTool-a08c0ae23dd3be2864787728bf4e74c4.json delete mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-566ab17bb6275aec1c9b3987dfebd126.json delete mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-6569dc605a724876f77e71cee5a3192d.json delete mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-c94f9a735104da2fd9c0c44ea1ed1ba1.json delete mode 100644 tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-d4bf31054d2e78fbc5e45673b16c9a89.json delete mode 100644 tests/Fixtures/Saloon/Agents/ChatRephraseAgent-a4f1718f3bd597aaa73aabb90ccb115b.json delete mode 100644 tests/Fixtures/Saloon/Agents/ChatRephraseAgent-d53f1768c34d5c32774aa924150302a0.json delete mode 100644 tests/Fixtures/Saloon/Agents/ChatRephraseAgent-d64a50cbac93e15e519fe16f1c1e212f.json delete mode 100644 tests/Fixtures/Saloon/Agents/ContextualRetrievalPreprocessingAgent.json delete mode 100644 tests/Fixtures/Saloon/Agents/ImageAgentTestAgent.json delete mode 100644 tests/Fixtures/Saloon/Agents/MultiQueryRetrieverAgent-6a3bece603a588c169c067f3b13d3f04.json delete mode 100644 tests/Fixtures/Saloon/Agents/MultiQueryRetrieverAgent-d54e72acfb8432e3c4ce48cab4f69391.json delete mode 100644 tests/Fixtures/Saloon/Agents/SQLToolAgent-09920d4481a4771ce866d0c345e25a91.json delete mode 100644 tests/Fixtures/Saloon/Agents/SQLToolAgent-0b0867cd35d40e15c4e6ee69e34045b9.json delete mode 100644 tests/Fixtures/Saloon/Agents/SQLToolAgent-0f2cbb046d14f10babf198d5839a56ee.json delete mode 100644 tests/Fixtures/Saloon/Agents/SQLToolAgent-1ba56f98ec619524c9cc046a17ce54c0.json delete mode 100644 tests/Fixtures/Saloon/Agents/SQLToolAgent-1f623066a9197d1a4b395fa6a7079da3.json delete mode 100644 tests/Fixtures/Saloon/Agents/SQLToolAgent-2065af6d3f057153a11772603ec65f5e.json delete mode 100644 tests/Fixtures/Saloon/Agents/SQLToolAgent-58b2f699ebef4cb1ebebf4221b228d5e.json delete mode 100644 tests/Fixtures/Saloon/Agents/SQLToolAgent-6991437c545f65d770fa0188d82516ce.json delete mode 100644 tests/Fixtures/Saloon/Agents/SQLToolAgent-aea323a5832b8415f679133f693e2b13.json delete mode 100644 tests/Fixtures/Saloon/Agents/SQLToolAgent-ca35aaabff5f4b53409aa9635246f84a.json delete mode 100644 tests/Fixtures/Saloon/Agents/SQLToolAgent-dbbeef79e6e45bbca928834e33282bd5.json delete mode 100644 tests/Fixtures/Saloon/Agents/SQLToolAgent-df626a1c7b4955432c0bc96cdbffe38f.json delete mode 100644 tests/Fixtures/Saloon/Agents/SQLToolAgent-f31398b834b15382e7ad551a39889dd7.json delete mode 100644 tests/Fixtures/Saloon/Console/SynapseArtisan-0619d6097b2a0bb5bfb6ef58d9dec10a.json delete mode 100644 tests/Fixtures/Saloon/Console/SynapseArtisan-a1d524092dba5bbe9f4a0bb7e0b9f909.json delete mode 100644 tests/Fixtures/Saloon/Console/SynapseArtisan-c1496a59f5142396d808855025edb586.json delete mode 100644 tests/Fixtures/Saloon/Console/SynapseArtisan-d04b51b713a0ff18d2779ed7991fbc0b.json delete mode 100644 tests/Fixtures/Saloon/Integrations/ClaudeTestAgent-0b01a311e346b7ad882115c9bdbd879c.json delete mode 100644 tests/Fixtures/Saloon/Integrations/ClaudeTestAgent-2384f5379c63d4a79106a90e25db0613.json delete mode 100644 tests/Fixtures/Saloon/Integrations/ClaudeTestAgent-9e4ad814794b1055d28d99c79ff01b37.json delete mode 100644 tests/Fixtures/Saloon/Integrations/ClaudeTestAgent-f53d2674b3ae26af9917b35b24751e4e.json create mode 100644 tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-0700e950a65562155bd8920325b51181.json delete mode 100644 tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-652ecfbf9539e59a6fd65d11f1a2fba2.json create mode 100644 tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-74cc9ac7d39fc2dbb068a35c3b4154a8.json delete mode 100644 tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-9ae29f2ff260a200c78e895234990b88.json delete mode 100644 tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-c31fbf2a429a96687e99c3b94fd406f3.json delete mode 100644 tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-e6ed7a42ff9b7106aa22db121275e575.json delete mode 100644 tests/Fixtures/Saloon/Integrations/OllamaToolTestAgent-73a9b9db662176ac0a3ed17dec715886.json delete mode 100644 tests/Fixtures/Saloon/Integrations/OllamaToolTestAgent-dd3c1226bcfb52db4cac0fc3cd00f4f0.json create mode 100644 tests/Fixtures/Saloon/Integrations/OllamaToolTestAgent-f1744f93cad29395237a8874e3527b0d.json create mode 100644 tests/Fixtures/Saloon/Integrations/OpenAiToolTestAgent-4715cf69359c579bd0b0aaebdb3cfe92.json delete mode 100644 tests/Fixtures/Saloon/Integrations/OpenAiToolTestAgent-75c161b01e340522e8715d4c26443fa9.json delete mode 100644 tests/Fixtures/Saloon/Integrations/OpenAiToolTestAgent-e0903793a2fa24d5a334f52b3d9b46c6.json delete mode 100644 tests/Fixtures/Saloon/Memory/CollectionMemory-71950ab35a36f639488c5a8c74463d53.json delete mode 100644 tests/Fixtures/Saloon/Memory/CollectionMemory-8cefaea3e899f6f2489b3487aa0a040d.json delete mode 100644 tests/Fixtures/Saloon/Memory/CollectionMemory-d14909a03783ba5b88f3dea252a1f37a.json delete mode 100644 tests/Fixtures/Saloon/Memory/CollectionMemory-fe703367aa1f98d7884652612a3c77a6.json delete mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-2f7d9367ae0a307240ca69cc079676ea.json delete mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-5e1fafee7be3b90f42757e4e40abcea4.json delete mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-6ca314ac196be36057a2a956836a6d8d.json delete mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-6ebf9da45af10a1c751df604f61ca011.json delete mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-88c99971ec0d20928a13254ec24d91e8.json delete mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-a5508037a2c8a381d8b9556e70d91322.json delete mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-bd12160cf0d4298d6b5dc4e13ae5a14d.json delete mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-ed9122f08b49da7ee73e6f97b414cde2.json delete mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-efd20736544ba41f5fe46cb57dd7102e.json delete mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-f35bc9bf07dc805cedb1cbda219d7a63.json delete mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-f36a2b79c2417f34329f24e826de8bce.json delete mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-36440b3fabab462e10a0388479c20807.json delete mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-47c33ba83a48790e1c7369c546e364d1.json delete mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-4dd943e799ab1c294682801edb307f4e.json delete mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-840fbdc622785ce8eaf6265ec38b373a.json delete mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-991e3ebf644dfe01a68fc39669e07299.json delete mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-Tool-37a6259cc0c1dae299a7866489dff0bd.json delete mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-b906c3b4c8019936fe115e4e62d3994c.json delete mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-de2f99ba9fd74f13849ee043bcee4bdf.json delete mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-ee890dab1469e9a09f9960cb3f09bf6d.json delete mode 100644 tests/Fixtures/Saloon/Memory/DatabaseMemory-495ba0207bd93966fcb5547c5509fadb.json delete mode 100644 tests/Fixtures/Saloon/Memory/DatabaseMemory-ccd0a3decc142cdd6d28fc823fb70573.json delete mode 100644 tests/Fixtures/Saloon/Memory/DatabaseMemory-d14909a03783ba5b88f3dea252a1f37a.json delete mode 100644 tests/Fixtures/Saloon/Memory/DatabaseMemory-fe703367aa1f98d7884652612a3c77a6.json create mode 100644 tests/Fixtures/Saloon/Tools/ClearbitCompanyTool-16d091022a41b3b3ba0ece72a85fd909.json delete mode 100644 tests/Fixtures/Saloon/Tools/ClearbitCompanyTool-41fce475054295b2a2d1473d04f7aa9c.json delete mode 100644 tests/Fixtures/Saloon/Tools/ClearbitCompanyTool-46246d8bf1cf8981b79398408f1c9374.json delete mode 100644 tests/Fixtures/Saloon/Tools/ClearbitCompanyTool-4844006bb7346a8cd4946135a26bb2f2.json delete mode 100644 tests/Fixtures/Saloon/Tools/CrunchbaseTool-45750ef652ddceeaa4b56a6798ccee02.json create mode 100644 tests/Fixtures/Saloon/Tools/CrunchbaseTool-53741f3dfe7c8ca47ce535174669b15d.json delete mode 100644 tests/Fixtures/Saloon/Tools/CrunchbaseTool-91330c935ee3c0271e4611b376117ea7.json delete mode 100644 tests/Fixtures/Saloon/Tools/CrunchbaseTool-94745683d5f8f1ed70612a5c036d54bf.json delete mode 100644 tests/Fixtures/Saloon/Tools/FirecrawlTool-76cdcfb02f44fe52a23d1c7248cd0cae.json create mode 100644 tests/Fixtures/Saloon/Tools/FirecrawlTool-9670841841d278662b0bb2ecc61c6f68.json delete mode 100644 tests/Fixtures/Saloon/Tools/SQLTestAgent-16ade5c7afd2bc82237a2c2c38ac43da.json delete mode 100644 tests/Fixtures/Saloon/Tools/SQLTestAgent-17f20fbcbd7ad04b632e81d68f84cf54.json delete mode 100644 tests/Fixtures/Saloon/Tools/SQLTestAgent-3e0f0fd702de589714e68a3b90a2ac15.json delete mode 100644 tests/Fixtures/Saloon/Tools/SQLTestAgent-4bee15d63dcfd3b54ef6f5e689b0d57e.json delete mode 100644 tests/Fixtures/Saloon/Tools/SQLTestAgent-4c3078626dcfa6950ae2eb9ae69d71d9.json delete mode 100644 tests/Fixtures/Saloon/Tools/SQLTestAgent-5c0d5e203062af04810663fcedb6fcee.json delete mode 100644 tests/Fixtures/Saloon/Tools/SQLTestAgent-61990bddb088570835ac9679ebff1a34.json delete mode 100644 tests/Fixtures/Saloon/Tools/SQLTestAgent-69088b2ddcf517d967507def8d0bc9e9.json delete mode 100644 tests/Fixtures/Saloon/Tools/SQLTestAgent-6c936275667473da519c385ffd4d808c.json delete mode 100644 tests/Fixtures/Saloon/Tools/SQLTestAgent-78ec69527dda312ef75dea8aa1f07271.json delete mode 100644 tests/Fixtures/Saloon/Tools/SQLTestAgent-abf1d4c9a9f535c0fbcb9eff86e94f08.json delete mode 100644 tests/Fixtures/Saloon/Tools/SQLTestAgent-e3b7bce01bc7df21e79bf8c5c7fbf744.json delete mode 100644 tests/Fixtures/Saloon/Tools/SQLTestAgent-e8159268c7e07a723f5966bd56d71812.json delete mode 100644 tests/Fixtures/Saloon/Tools/SQLTestAgent-fd2cd6d73785dc8bae6e230fd57c4dd7.json delete mode 100644 tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-3ca51b450f65fd56079ce1db68405384.json delete mode 100644 tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-8b5a265c43dea6f4ed40a3d21bd13bf1.json delete mode 100644 tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-937c344a3cba8d7375b74873e978e987.json delete mode 100644 tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-9aaf34285a5c2c42a794174131d55815.json delete mode 100644 tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-Tool.json delete mode 100644 tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-cfec9d7d5277386c7e0255e1ca7e2d1e.json delete mode 100644 tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-30b3c5e13ad916219ec1fbbc2983cb19.json delete mode 100644 tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-4d9c37b83db9353afd0462b60417eb0e.json delete mode 100644 tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-8c4de06e2a7064e26c30dd1131e7c149.json delete mode 100644 tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-Tool.json delete mode 100644 tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-aabcdc9cde285aa6d7d0dd01b03c7b1c.json delete mode 100644 tests/Fixtures/Saloon/Tools/SerperTestAgent-28125624c9418e220ffb104b593f9f20.json delete mode 100644 tests/Fixtures/Saloon/Tools/SerperTestAgent-39474d616ece521a51e916ab18d5ff87.json delete mode 100644 tests/Fixtures/Saloon/Tools/SerperTestAgent-4d9c37b83db9353afd0462b60417eb0e.json create mode 100644 tests/Fixtures/Saloon/Tools/SerperTestAgent-9e49a87ac181a72a979874028f1f6034.json delete mode 100644 tests/Fixtures/Saloon/Tools/SerperTestAgent-f7bf86866f50c4d6aa1c3352ff0b6f8c.json delete mode 100644 tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-15f86e44009e468d98a2182a922488fc.json delete mode 100644 tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-391e03d399bbd1bfda18308c0ddfd184.json delete mode 100644 tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-39bc17d178807a04cb3b9318f2573b99.json delete mode 100644 tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-3ad8cdc0143898a9c2715861e2e3b459.json delete mode 100644 tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-78b21fef39089d0fc8f6d5fa86f6b943.json delete mode 100644 tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-7df97c9fde0e54abd5268b1e4fa76fca.json delete mode 100644 tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-e71e66e0e81b0a350fd4cc375719fc88.json diff --git a/src/Agent.php b/src/Agent.php index 991968e..34c4c71 100644 --- a/src/Agent.php +++ b/src/Agent.php @@ -80,7 +80,7 @@ public function handle(?array $input, ?array $extraAgentArgs = []): Message $this->pendingAgentTask = $this->pendingAgentTask->middleware()->executeEndThreadPipeline($this->pendingAgentTask); - return $this->pendingAgentTask->currentIteration()->getResponse(); + return $this->pendingAgentTask->getResponse(); } /** @@ -94,20 +94,23 @@ protected function doLoop(): PendingAgentTask $this->pendingAgentTask->middleware()->executeStartIterationPipeline($this->pendingAgentTask); $prompt = $this->getPrompt($this->pendingAgentTask); - // append the prompt chain and iteration memory so tool calls are included - $prompt = $prompt."\n".$this->pendingAgentTask->iterationMemory()->asInputs()['memoryWithMessages']; - $prompt = $this->pendingAgentTask->middleware()->executePromptGeneratedPipeline($prompt); $promptChain = $this->parsePrompt($prompt); + // append the prompt chain and iteration memory so tool calls are included + $promptChain = [ + ...$promptChain, + ...$this->pendingAgentTask->getToolCalls() + ]; + $promptChain = $this->pendingAgentTask->middleware()->executePromptParsedPipeline($promptChain); - $this->pendingAgentTask->currentIteration()->setPromptChain($promptChain); + $this->pendingAgentTask->setPromptChain($promptChain); // Create the Chat request we will be sending. $this->integration->handlePendingAgentTaskCompletion($this->pendingAgentTask); $this->pendingAgentTask->middleware()->executeIntegrationResponsePipeline($this->pendingAgentTask); - switch ($this->pendingAgentTask->currentIteration()->finishReason()) { + switch ($this->pendingAgentTask->getFinishReason()) { case FinishReason::TOOL_CALL: $this->pendingAgentTask->middleware()->executeStartToolCallPipeline($this->pendingAgentTask); $this->handleTools($this->pendingAgentTask); @@ -118,7 +121,7 @@ protected function doLoop(): PendingAgentTask return $this->pendingAgentTask; default: - throw new UnknownFinishReasonException("{$this->pendingAgentTask->currentIteration()->finishReason()} is not a valid finish reason."); + throw new UnknownFinishReasonException("{$this->pendingAgentTask->getFinishReason()} is not a valid finish reason."); } $this->pendingAgentTask->middleware()->executeEndIterationPipeline($this->pendingAgentTask); } @@ -219,7 +222,7 @@ protected function parsePrompt(string $prompt): array private function handleTools(PendingAgentTask $pendingAgentTask): void { - $response = $pendingAgentTask->currentIteration()->getResponse()->toArray(); + $response = $pendingAgentTask->getResponse()->toArray(); if (! empty($response['tool_call_id'])) { $toolResult = $this->executeToolCall($response, $pendingAgentTask); @@ -227,8 +230,7 @@ private function handleTools(PendingAgentTask $pendingAgentTask): void $response['tool_content'] = $toolResult; } - $pendingAgentTask->iterationMemory()->create(Message::make($response)); - $pendingAgentTask->currentIteration()->setResponse(Message::make($response)); + $pendingAgentTask->addToolCall(Message::make($response)); } /** diff --git a/src/AgentTask/PendingAgentTask.php b/src/AgentTask/PendingAgentTask.php index 55fde8b..d720686 100644 --- a/src/AgentTask/PendingAgentTask.php +++ b/src/AgentTask/PendingAgentTask.php @@ -8,28 +8,27 @@ use UseTheFork\Synapse\Agent; use UseTheFork\Synapse\AgentTask\StartTasks\BootTraits; use UseTheFork\Synapse\AgentTask\StartTasks\MergeProperties; -use UseTheFork\Synapse\Contracts\Memory; -use UseTheFork\Synapse\Memory\CollectionMemory; +use UseTheFork\Synapse\Enums\FinishReason; +use UseTheFork\Synapse\Traits\HasConfig; use UseTheFork\Synapse\Traits\HasMiddleware; +use UseTheFork\Synapse\ValueObject\Message; class PendingAgentTask { use HasMiddleware; + use hasConfig; protected Agent $agent; - protected CurrentIteration $currentIteration; protected Collection $inputs; - protected Memory $iterationMemory; + protected Message $response; + protected Collection $toolCalls; + protected array $tools = []; public function __construct(Agent $agent) { $this->agent = $agent; - $this->currentIteration = new CurrentIteration; - $this->iterationMemory = new CollectionMemory(); - $this->iterationMemory->boot(); - $this ->tap(new BootTraits) ->tap(new MergeProperties); @@ -75,6 +74,11 @@ public function addTool(string $key, array $value): void $this->tools[$key] = $value; } + public function addToolCall(Message $toolCallWithContent): void + { + $this->toolCalls->push($toolCallWithContent); + } + /** * Retrieve the agent associated with the current task. * @@ -85,14 +89,14 @@ public function agent(): Agent return $this->agent; } - /** - * Get the current iteration of the agent task. - * - * @return CurrentIteration|null The current iteration instance or null if not set. - */ - public function currentIteration(): ?CurrentIteration + public function getExtraAgentArgs(): array + { + return $this->config()->get('extraAgentArgs'); + } + + public function getFinishReason(): FinishReason { - return $this->currentIteration; + return FinishReason::from($this->response->finishReason()); } /** @@ -107,6 +111,26 @@ public function getInput(string $key): mixed return $this->inputs[$key] ?? null; } + public function getPromptChain(): array + { + return $this->config()->get('promptChain'); + } + + public function getResponse(): Message + { + return $this->response; + } + + public function setResponse(Message $message): void + { + $this->response = $message; + } + + public function getToolCalls(): array + { + return $this->toolCalls->all(); + } + /** * Get all inputs as an array. * @@ -127,23 +151,17 @@ public function inputs(): array */ public function reboot(array $inputs, array $extraAgentArgs = []): void { - $this->currentIteration = new CurrentIteration; - $this->currentIteration->setExtraAgentArgs($extraAgentArgs); + $this->config()->add('extraAgentArgs', $extraAgentArgs); $this->inputs = collect($inputs); - $this->iterationMemory()->clear(); + $this->toolCalls = collect(); $this->middleware()->executeStartThreadPipeline($this); } - /** - * Retrieve the current tasks memory instance. - * - * @return Memory The pending tasks memory instance. - */ - public function iterationMemory(): Memory + public function setPromptChain(array $promptChain): void { - return $this->iterationMemory; + $this->config()->add('promptChain', $promptChain); } /** diff --git a/src/Integrations/ClaudeIntegration.php b/src/Integrations/ClaudeIntegration.php index 77d6137..6def6b1 100644 --- a/src/Integrations/ClaudeIntegration.php +++ b/src/Integrations/ClaudeIntegration.php @@ -42,12 +42,12 @@ public function handlePendingAgentTaskCompletion( $claudeAIConnector = new ClaudeAIConnector; $message = $claudeAIConnector->doCompletionRequest( - prompt: $pendingAgentTask->currentIteration()->getPromptChain(), + prompt: $pendingAgentTask->getPromptChain(), tools: $pendingAgentTask->tools(), - extraAgentArgs: $pendingAgentTask->currentIteration()->getExtraAgentArgs() + extraAgentArgs: $pendingAgentTask->getExtraAgentArgs() ); - $pendingAgentTask->currentIteration()->setResponse($message); + $pendingAgentTask->setResponse($message); return $pendingAgentTask; } diff --git a/src/Integrations/Connectors/OpenAI/Requests/ChatRequest.php b/src/Integrations/Connectors/OpenAI/Requests/ChatRequest.php index a0a2d19..4c877c2 100644 --- a/src/Integrations/Connectors/OpenAI/Requests/ChatRequest.php +++ b/src/Integrations/Connectors/OpenAI/Requests/ChatRequest.php @@ -24,9 +24,23 @@ public function __construct( public readonly array $extraAgentArgs = [] ) {} - public function resolveEndpoint(): string + public function createDtoFromResponse(Response $response): Message { - return '/chat/completions'; + $data = $response->array(); + $message = $data['choices'][0]['message'] ?? []; + $message['finish_reason'] = $data['choices'][0]['finish_reason'] ?? ''; + if (isset($message['tool_calls'])) { + + $message['tool_call_id'] = $message['tool_calls'][0]['id']; + $message['tool_name'] = $message['tool_calls'][0]['function']['name']; + $message['tool_arguments'] = $message['tool_calls'][0]['function']['arguments']; + unset($message['tool_calls']); + + // Open AI sends a tool call via assistant role. We change it to tool here to make processing easier. + $message['role'] = Role::TOOL; + } + + return Message::make($message); } public function defaultBody(): array @@ -130,22 +144,8 @@ private function formatImageMessage(Message $message): array return $payload; } - public function createDtoFromResponse(Response $response): Message + public function resolveEndpoint(): string { - $data = $response->array(); - $message = $data['choices'][0]['message'] ?? []; - $message['finish_reason'] = $data['choices'][0]['finish_reason'] ?? ''; - if (isset($message['tool_calls'])) { - - $message['tool_call_id'] = $message['tool_calls'][0]['id']; - $message['tool_name'] = $message['tool_calls'][0]['function']['name']; - $message['tool_arguments'] = $message['tool_calls'][0]['function']['arguments']; - unset($message['tool_calls']); - - // Open AI sends a tool call via assistant role. We change it to tool here to make processing easier. - $message['role'] = Role::TOOL; - } - - return Message::make($message); + return '/chat/completions'; } } diff --git a/src/Integrations/OllamaIntegration.php b/src/Integrations/OllamaIntegration.php index 0252ca0..48a1f7f 100644 --- a/src/Integrations/OllamaIntegration.php +++ b/src/Integrations/OllamaIntegration.php @@ -42,12 +42,12 @@ public function handlePendingAgentTaskCompletion( $ollamaAIConnector = new OllamaAIConnector; $message = $ollamaAIConnector->doCompletionRequest( - prompt: $pendingAgentTask->currentIteration()->getPromptChain(), + prompt: $pendingAgentTask->getPromptChain(), tools: $pendingAgentTask->tools(), - extraAgentArgs: $pendingAgentTask->currentIteration()->getExtraAgentArgs() + extraAgentArgs: $pendingAgentTask->getExtraAgentArgs() ); - $pendingAgentTask->currentIteration()->setResponse($message); + $pendingAgentTask->setResponse($message); return $pendingAgentTask; } diff --git a/src/Integrations/OpenAIIntegration.php b/src/Integrations/OpenAIIntegration.php index a62dfe0..ee74c01 100644 --- a/src/Integrations/OpenAIIntegration.php +++ b/src/Integrations/OpenAIIntegration.php @@ -13,23 +13,9 @@ class OpenAIIntegration implements Integration { - /** - * {@inheritdoc} - */ - public function handlePendingAgentTaskCompletion( - PendingAgentTask $pendingAgentTask - ): PendingAgentTask { - - $openAIConnector = new OpenAIConnector; - $message = $openAIConnector->doCompletionRequest( - prompt: $pendingAgentTask->currentIteration()->getPromptChain(), - tools: $pendingAgentTask->tools(), - extraAgentArgs: $pendingAgentTask->currentIteration()->getExtraAgentArgs() - ); - - $pendingAgentTask->currentIteration()->setResponse($message); - - return $pendingAgentTask; + public function createEmbeddings(string $input, array $extraAgentArgs = []): EmbeddingResponse + { + return $this->send(new EmbeddingsRequest($input, $extraAgentArgs))->dto(); } /** @@ -47,8 +33,22 @@ public function handleCompletion( ); } - public function createEmbeddings(string $input, array $extraAgentArgs = []): EmbeddingResponse - { - return $this->send(new EmbeddingsRequest($input, $extraAgentArgs))->dto(); + /** + * {@inheritdoc} + */ + public function handlePendingAgentTaskCompletion( + PendingAgentTask $pendingAgentTask + ): PendingAgentTask { + + $openAIConnector = new OpenAIConnector; + $message = $openAIConnector->doCompletionRequest( + prompt: $pendingAgentTask->getPromptChain(), + tools: $pendingAgentTask->tools(), + extraAgentArgs: $pendingAgentTask->getExtraAgentArgs() + ); + + $pendingAgentTask->setResponse($message); + + return $pendingAgentTask; } } diff --git a/src/Traits/Agent/ValidatesOutputSchema.php b/src/Traits/Agent/ValidatesOutputSchema.php index fbefb8a..6919d9b 100644 --- a/src/Traits/Agent/ValidatesOutputSchema.php +++ b/src/Traits/Agent/ValidatesOutputSchema.php @@ -1,192 +1,191 @@ middleware()->onStartThread(fn (PendingAgentTask $pendingAgentTask) => $this->addOutputSchema($pendingAgentTask), 'addOutputSchema'); + $this->middleware()->onEndThread(fn (PendingAgentTask $pendingAgentTask) => $this->doValidateOutputSchema($pendingAgentTask), 'doValidateOutputSchema', PipeOrder::LAST); + } /** - * Indicates if the agent has an output schema. + * @throws MissingResolverException */ - trait ValidatesOutputSchema + public function addOutputSchema(PendingAgentTask $pendingAgentTask): PendingAgentTask { - use HasMiddleware; - - /** - * The maximum number "loops" that this Validation should run . - */ - protected int $maximumValidationIterations = 5; - - /** - * sets the initial output schema type this agent will use. - */ - public function bootValidatesOutputSchema(): void - { - $this->middleware()->onStartThread(fn(PendingAgentTask $pendingAgentTask) => $this->addOutputSchema($pendingAgentTask), 'addOutputSchema'); - $this->middleware()->onEndThread(fn(PendingAgentTask $pendingAgentTask) => $this->doValidateOutputSchema($pendingAgentTask), 'doValidateOutputSchema', PipeOrder::LAST); - } + $pendingAgentTask->addInput('outputSchema', $this->getOutputSchema()); + + return $pendingAgentTask; + } - /** - * @throws MissingResolverException - */ - public function addOutputSchema(PendingAgentTask $pendingAgentTask): PendingAgentTask - { - $pendingAgentTask->addInput('outputSchema', $this->getOutputSchema()); - return $pendingAgentTask; + /** + * Retrieves the output rules as a JSON string. + * + * @return string|null The output rules encoded as a JSON string. Returns null if there are no output rules. + * + * @throws MissingResolverException + */ + public function getOutputSchema(): ?string + { + $outputParserPromptPart = []; + foreach ($this->resolveOutputSchema() as $rule) { + $outputParserPromptPart[$rule->getName()] = "({$rule->getRules()}) {$rule->getDescription()}"; } - /** - * Retrieves the output rules as a JSON string. - * - * @return string|null The output rules encoded as a JSON string. Returns null if there are no output rules. - * @throws MissingResolverException - */ - public function getOutputSchema(): ?string - { - $outputParserPromptPart = []; - foreach ($this->resolveOutputSchema() as $rule) { - $outputParserPromptPart[$rule->getName()] = "({$rule->getRules()}) {$rule->getDescription()}"; - } + return "```json\n".json_encode($outputParserPromptPart, JSON_PRETTY_PRINT)."\n```"; + } - return "```json\n" . json_encode($outputParserPromptPart, JSON_PRETTY_PRINT) . "\n```"; - } + /** + * Sets the output rules for validation. + * + * @return array + * + * @throws MissingResolverException + */ + public function resolveOutputSchema(): array + { + throw new MissingResolverException('ValidatesOutputSchema', 'resolveOutputSchema'); + } - /** - * Sets the output rules for validation. - * - * @return array - * @throws MissingResolverException - */ - public function resolveOutputSchema(): array - { - throw new MissingResolverException('ValidatesOutputSchema', 'resolveOutputSchema'); - } + /** + * Performs validation on the given response. + * + * @param PendingAgentTask $pendingAgentTask The response to validate. + * @return PendingAgentTask If validation passes, it returns the validated response. Otherwise, it enters a loop and performs revalidation. + * + * @throws Throwable + */ + public function doValidateOutputSchema(PendingAgentTask $pendingAgentTask): PendingAgentTask + { - /** - * Performs validation on the given response. - * - * @param PendingAgentTask $pendingAgentTask The response to validate. - * - * @return PendingAgentTask If validation passes, it returns the validated response. Otherwise, it enters a loop and performs revalidation. - * - * @throws Throwable - */ - public function doValidateOutputSchema(PendingAgentTask $pendingAgentTask): PendingAgentTask - { - - $response = $pendingAgentTask->currentIteration()->getResponse()->content(); - - $outputSchema = []; - collect($this->resolveOutputSchema())->each(function ($rule) use (&$outputSchema): void { - $outputSchema[$rule->getName()] = $rule->getRules(); - }); - - for ($i = 1; $i <= $this->maximumValidationIterations; $i++) { - $result = $this->parseResponse($response); - $errorsAsString = ''; - if (!empty($result)) { - $validator = Validator::make($result, $outputSchema); - if (!$validator->fails()) { - - $currentResponse = $pendingAgentTask->currentIteration()->getResponse(); - $updatedResponse = Message::make([ - ...$currentResponse->toArray(), - 'content' => $validator->validated(), - ]); - $pendingAgentTask->currentIteration()->setResponse($updatedResponse); - - return $pendingAgentTask; - } - - $errorsFlat = collect(); - $errors = $validator->errors()->messages(); - foreach ($errors as $error) { - $errorsFlat->push(implode(PHP_EOL, $error)); - } - $errorsFlat = $errorsFlat->implode(PHP_EOL); - $errorsAsString = $errorsFlat . "\n\n"; + $response = $pendingAgentTask->getResponse()->content(); + + $outputSchema = []; + collect($this->resolveOutputSchema())->each(function ($rule) use (&$outputSchema): void { + $outputSchema[$rule->getName()] = $rule->getRules(); + }); + + for ($i = 1; $i <= $this->maximumValidationIterations; $i++) { + $result = $this->parseResponse($response); + $errorsAsString = ''; + if (! empty($result)) { + $validator = Validator::make($result, $outputSchema); + if (! $validator->fails()) { + + $currentResponse = $pendingAgentTask->getResponse(); + $updatedResponse = Message::make([ + ...$currentResponse->toArray(), + 'content' => $validator->validated(), + ]); + $pendingAgentTask->setResponse($updatedResponse); + + return $pendingAgentTask; } - $response = $this->doRevalidate($response, $errorsAsString); - //since all integrations return a Message value object we need to grab the content - $response = $response->currentIteration()->getResponse()->content(); + $errorsFlat = collect(); + $errors = $validator->errors()->messages(); + foreach ($errors as $error) { + $errorsFlat->push(implode(PHP_EOL, $error)); + } + $errorsFlat = $errorsFlat->implode(PHP_EOL); + $errorsAsString = $errorsFlat."\n\n"; } + $response = $this->doRevalidate($response, $errorsAsString); - throw new MaximumIterationsException($this->maximumValidationIterations); + //since all integrations return a Message value object we need to grab the content + $response = $response->getResponse()->content(); } - /** - * Parses the input response and returns it as an associative array. - * - * @param string $input The input response to parse. - * - * @return array|null The parsed response as an associative array, or null if parsing fails. - */ - protected function parseResponse(string $input): ?array - { - - # we attempt to Decode the Json in a few ways. It's best to give all models a chance before failing. - $jsonFormat = json_decode( - str($input)->replace([ - '```json', - '```', - ], '')->toString(), TRUE - ); - - if(!empty($jsonFormat)){ - return $jsonFormat; - } + throw new MaximumIterationsException($this->maximumValidationIterations); + } - return json_decode( - str($input)->replace([ - '```', - '```', - ], '')->toString(), TRUE - ); - } + /** + * Parses the input response and returns it as an associative array. + * + * @param string $input The input response to parse. + * @return array|null The parsed response as an associative array, or null if parsing fails. + */ + protected function parseResponse(string $input): ?array + { + + // we attempt to Decode the Json in a few ways. It's best to give all models a chance before failing. + $jsonFormat = json_decode( + str($input)->replace([ + '```json', + '```', + ], '')->toString(), true + ); - /** - * Performs revalidation on the given result. - * - * @param string $errors The validation errors. - * - * @return PendingAgentTask The result of handling the validation completion against the prompt chain. - * - * @throws Throwable - */ - protected function doRevalidate(string $response, string $errors = ''): PendingAgentTask - { - - $prompt = view('synapse::Prompts.ReValidateResponsePrompt', [ - 'outputSchema' => $this->getOutputSchema(), - 'lastResponse' => $response, - 'errors' => $errors - ])->render(); - - $validationPrompt = Message::make([ - 'role' => 'user', - 'content' => $prompt, - ]); - - - //We get the whole conversation so far but append a validation message - $promptChain = $this->pendingAgentTask->currentIteration()->getPromptChain(); - - $this->pendingAgentTask->currentIteration()->setPromptChain([ - ...$promptChain, - $validationPrompt - ]); - - // Create the Chat request we will be sending. - return $this->integration->handlePendingAgentTaskCompletion($this->pendingAgentTask); + if (! empty($jsonFormat)) { + return $jsonFormat; } + + return json_decode( + str($input)->replace([ + '```', + '```', + ], '')->toString(), true + ); + } + + /** + * Performs revalidation on the given result. + * + * @param string $errors The validation errors. + * @return PendingAgentTask The result of handling the validation completion against the prompt chain. + * + * @throws Throwable + */ + protected function doRevalidate(string $response, string $errors = ''): PendingAgentTask + { + + $prompt = view('synapse::Prompts.ReValidateResponsePrompt', [ + 'outputSchema' => $this->getOutputSchema(), + 'lastResponse' => $response, + 'errors' => $errors, + ])->render(); + + $message = Message::make([ + 'role' => 'user', + 'content' => $prompt, + ]); + + //We get the whole conversation so far but append a validation message + $promptChain = $this->pendingAgentTask->getPromptChain(); + + $this->pendingAgentTask->setPromptChain([ + ...$promptChain, + $message, + ]); + + // Create the Chat request we will be sending. + return $this->integration->handlePendingAgentTaskCompletion($this->pendingAgentTask); } +} diff --git a/tests/Fixtures/OpenAi/OpenAiFixture.php b/tests/Fixtures/OpenAi/OpenAiFixture.php new file mode 100644 index 0000000..f401f79 --- /dev/null +++ b/tests/Fixtures/OpenAi/OpenAiFixture.php @@ -0,0 +1,19 @@ + 'REDACTED', + 'x-request-id' => 'REDACTED', + "Set-Cookie" => 'REDACTED', + 'CF-RAY' => 'REDACTED', + ]; + } + } diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-1490b8772b2bf708d3727e1fd1e12414.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-1490b8772b2bf708d3727e1fd1e12414.json deleted file mode 100644 index bee3a0f..0000000 --- a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-1490b8772b2bf708d3727e1fd1e12414.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 23:58:48 GMT", - "Content-Type": "application\/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-ALJ3lAka26S9EVMFchmwL6ox7ddvT\",\n \"object\": \"chat.completion\",\n \"created\": 1729641517,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"paragraphs\\\": [\\n \\\"The American Civil War, fought from 1861 to 1865, was a pivotal conflict in United States history, primarily about states' rights and slavery. The war began after several Southern states seceded from the Union, forming the Confederate States of America in response to the election of Abraham Lincoln in 1860 and the growing tensions related to slavery. In 1861, the conflict officially commenced with the Confederate attack on Fort Sumter in South Carolina on April 12th. This led President Lincoln to call for 75,000 volunteers, sparking additional Southern states to secede. The key early battles included Bull Run and the Battle of Shiloh, indicating that the war would be longer and more brutal than initially anticipated.\\\",\\n \\\"By 1862, the war had expanded across multiple fronts. Key events include the introduction of the Emancipation Proclamation by President Lincoln, which declared all slaves in Confederate states to be free, turning the conflict more distinctly into a war about slavery as well as state rights. Major battles like Antietam, which remains one of the deadliest single-day battles in American history, further underscored the ferocity of the conflict.\\\",\\n \\\"The year 1863 is marked significantly by the Battle of Gettysburg and the Siege of Vicksburg. These were pivotal Union victories that significantly turned the tide of the war. The Gettysburg Address, delivered by Lincoln in November, redefined the purpose of the war and is one of the most famous speeches in American history.\\\",\\n \\\"In 1864-65, General Ulysses S. Grant led the Union forces in a series of battles that gradually crushed the Confederate resistance. Sherman's March to the Sea further devastated the South's infrastructure and economy. The war concluded with the surrender of Confederate General Robert E. Lee to Grant at Appomattox Court House on April 9, 1865. The aftermath of the war involved Reconstruction, a period of rebuilding and integrating the Southern states back into the Union, marked by significant social, economic, and legislative changes.\\\"\\n ]\\n}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 568,\n \"completion_tokens\": 432,\n \"total_tokens\": 1000,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-2a0fcbb75e327652be2126fa648bd3e7.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-2a0fcbb75e327652be2126fa648bd3e7.json deleted file mode 100644 index a5ef213..0000000 --- a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-2a0fcbb75e327652be2126fa648bd3e7.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 23:58:53 GMT", - "Content-Type": "application/json", - "Content-Length": "738", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-ALJ40egt1p5rATI4JoqpMLM7PBxaw\",\n \"object\": \"chat.completion\",\n \"created\": 1729641532,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"query\\\": \\\"American Civil War 1862 key events Emancipation Proclamation and Battle of Antietam\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 439,\n \"completion_tokens\": 28,\n \"total_tokens\": 467,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-47261d97210e865ca4818128f63d6926.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-47261d97210e865ca4818128f63d6926.json deleted file mode 100644 index f379967..0000000 --- a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-47261d97210e865ca4818128f63d6926.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 23:59:24 GMT", - "Content-Type": "application\/json", - "Content-Length": "1745", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-ALJ4Q6NNevk8phJKhiE4vUNHF8sIj\",\n \"object\": \"chat.completion\",\n \"created\": 1729641558,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"answer\\\": \\\"The American Civil War, fought from 1861 to 1865, was a defining conflict in United States history, intensively driven by issues of states' rights, and fundamentally, the institution of slavery. The eruption of war followed the 1860 election of Abraham Lincoln, leading to the secession of seven Southern slave-holding states and the establishment of the Confederate States of America. The war commenced with the Confederate attack on Fort Sumter in South Carolina on April 12, 1861, which prompted President Lincoln to call for troops, causing more states to join the Confederacy.\\\\n\\\\nAn early pivotal battle was the Battle of Gettysburg in 1863, which, occurring four months prior to Lincoln's famous Gettysburg Address, marked a turning point. The battle was one of the bloodiest, with over 45,000 men killed, injured, captured, or missing. Lincoln's Gettysburg Address, delivered at the dedication of a military cemetery there, has since been celebrated as a profound reminder of the war's higher purpose\u2014highlighting themes of human equality and the enduring value of democracy.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 4604,\n \"completion_tokens\": 238,\n \"total_tokens\": 4842,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-475d90e301668292a051dde550aee5a3.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-475d90e301668292a051dde550aee5a3.json deleted file mode 100644 index bdab6cb..0000000 --- a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-475d90e301668292a051dde550aee5a3.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 23:59:07 GMT", - "Content-Type": "application\/json", - "Content-Length": "1980", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID" - }, - "data": "{\n \"id\": \"chatcmpl-ALJ47vKbJUXDkl423CUWyfEeYdRN9\",\n \"object\": \"chat.completion\",\n \"created\": 1729641539,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"answer\\\": \\\"The American Civil War, fought from 1861 to 1865, was a pivotal conflict in United States history, primarily over the issues of states' rights, and more fundamentally, the institution of slavery. The war erupted after the election of Abraham Lincoln in 1860, leading to the secession of seven Southern slave states and the formation of the Confederate States of America. The conflict was precipitated by the Confederate attack on Fort Sumter in South Carolina on April 12, 1861, prompting President Lincoln to issue a call for troops, which led to more states joining the Confederacy.\\\\n\\\\nKey early battles included Bull Run and the Battle of Shiloh, demonstrating that the conflict would be neither quick nor easy. In 1862, the Emancipation Proclamation promised freedom to slaves in Confederate states, reframing the war as a struggle not just for union but also for human freedom. The Battle of Antietam, on September 17, 1862, marked one of the deadliest days in American military history and was significant not just militarily but for its political outcomes as well\u2014providing President Lincoln the momentum needed to issue the preliminary Emancipation Proclamation. This decree, which promised to free slaves in rebel states, changed the trajectory of the war and solidified the moral grounds of the Union cause.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 7218,\n \"completion_tokens\": 280,\n \"total_tokens\": 7498,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-72d3babdd785f7230e988f2e032f473d.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-72d3babdd785f7230e988f2e032f473d.json deleted file mode 100644 index 5e91bf4..0000000 --- a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-72d3babdd785f7230e988f2e032f473d.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 23:59:09 GMT", - "Content-Type": "application/json", - "Content-Length": "724", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-ALJ4GnKkb2OOggdv6jP2hTMUmIbnz\",\n \"object\": \"chat.completion\",\n \"created\": 1729641548,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"query\\\": \\\"Significance of Gettysburg Address 1863, impact on American Civil War\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 545,\n \"completion_tokens\": 26,\n \"total_tokens\": 571,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-bc0c986806c46d9aa119053ac316b3ce.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-bc0c986806c46d9aa119053ac316b3ce.json deleted file mode 100644 index 745b5ac..0000000 --- a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-bc0c986806c46d9aa119053ac316b3ce.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 23:59:50 GMT", - "Content-Type": "application\/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-ALJ4oqf51aXN1zvkO1oujJ3hEVZ7g\",\n \"object\": \"chat.completion\",\n \"created\": 1729641582,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"answer\\\": \\\"### Timeline of the American Civil War\\\\n\\\\n#### Prelude to Conflict\\\\nThe American Civil War, which spanned from 1861 to 1865, was a pivotal conflict in the history of the United States largely centered around issues of slavery and states' rights. Following the election of Abraham Lincoln in 1860, disunion sentiments heightened, leading to the secession of several Southern states to form the Confederate States of America. The formal beginning of the war was marked by the Confederate bombardment of Fort Sumter on April 12, 1861, prompting Lincoln's call for troops and triggering further secessions.\\\\n\\\\n#### Turning Points and Key Battles\\\\nA crucial turning point in the conflict was the Battle of Gettysburg in July 1863, one of the bloodiest battles over three days, which ended in a significant defeat for the Confederates. This battle was later commemorated by President Lincoln's Gettysburg Address, which underscored the war's purpose of preserving a nation dedicated to the principles of equality and democracy.\\\\n\\\\n#### Conclusion and Aftermath\\\\nIn the concluding years of the war, under the leadership of General Ulysses S. Grant, the Union forces launched decisive campaigns, leading eventually to the fall of key Southern cities and the surrender of General Robert E. Lee at Appomattox Court House on April 9, 1865. The war officially concluded with further surrenders across the Confederate armies and marked a profound transformation in American society, leading into the period known as Reconstruction, aimed at re-integrating the seceded states and abolishing slavery.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 480,\n \"completion_tokens\": 344,\n \"total_tokens\": 824,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-d5c8e692581754f3aac57899f4c2603f.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-d5c8e692581754f3aac57899f4c2603f.json deleted file mode 100644 index 879e9c6..0000000 --- a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-d5c8e692581754f3aac57899f4c2603f.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 23:58:37 GMT", - "Content-Type": "application\/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-ALJ3blWUIa2V98gyv5PyEKSjrbTxf\",\n \"object\": \"chat.completion\",\n \"created\": 1729641507,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"answer\\\": \\\"The American Civil War, fought from 1861 to 1865, was a pivotal conflict in United States history, primarily about states' rights and slavery. The war began after several Southern states seceded from the Union, forming the Confederate States of America in response to the election of Abraham Lincoln in 1860 and the growing tensions related to slavery.\\\\n\\\\nIn 1861, the conflict officially commenced with the Confederate attack on Fort Sumter in South Carolina on April 12th. This led President Lincoln to call for 75,000 volunteers, sparking additional Southern states to secede. The key early battles included Bull Run and the Battle of Shiloh, indicating that the war would be longer and more brutal than initially anticipated.\\\\n\\\\nBy 1862, the war had expanded across multiple fronts. Key events include the introduction of the Emancipation Proclamation by President Lincoln, which declared all slaves in Confederate states to be free, turning the conflict more distinctly into a war about slavery as well as state rights. Major battles like Antietam, which remains one of the deadliest single-day battles in American history, further underscored the ferocity of the conflict.\\\\n\\\\nThe year 1863 is marked significantly by the Battle of Gettysburg and the Siege of Vicksburg. These were pivotal Union victories that significantly turned the tide of the war. The Gettysburg Address, delivered by Lincoln in November, redefined the purpose of the war and is one of the most famous speeches in American history.\\\\n\\\\nIn 1864-65, General Ulysses S. Grant led the Union forces in a series of battles that gradually crushed the Confederate resistance. Sherman's March to the Sea further devastated the South's infrastructure and economy. The war concluded with the surrender of Confederate General Robert E. Lee to Grant at Appomattox Court House on April 9, 1865. The aftermath of the war involved Reconstruction, a period of rebuilding and integrating the Southern states back into the Union, marked by significant social, economic, and legislative changes.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 120,\n \"completion_tokens\": 430,\n \"total_tokens\": 550,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-ebe56fdb70a6f5dc2640a5e4b73366bc.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-ebe56fdb70a6f5dc2640a5e4b73366bc.json deleted file mode 100644 index 7d43245..0000000 --- a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-ebe56fdb70a6f5dc2640a5e4b73366bc.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 23:59:42 GMT", - "Content-Type": "application\/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-ALJ4gmVxvqX31vwKeueb1yEcpPVqE\",\n \"object\": \"chat.completion\",\n \"created\": 1729641574,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"answer\\\": \\\"The American Civil War, which spanned from 1861 to 1865, was a pivotal conflict in the history of the United States largely centered around issues of slavery and states' rights. Following the election of Abraham Lincoln in 1860, disunion sentiments heightened, leading to the secession of several Southern states to form the Confederate States of America. The formal beginning of the war was marked by the Confederate bombardment of Fort Sumter on April 12, 1861, prompting Lincoln's call for troops and triggering further secessions.\\\\n\\\\nA crucial turning point in the conflict was the Battle of Gettysburg in July 1863, one of the bloodiest battles over three days, which ended in a significant defeat for the Confederates. This battle was later commemorated by President Lincoln's Gettysburg Address, which underscored the war's purpose of preserving a nation dedicated to the principles of equality and democracy.\\\\n\\\\nIn the concluding years of the war, under the leadership of General Ulysses S. Grant, the Union forces launched decisive campaigns, leading eventually to the fall of key Southern cities and the surrender of General Robert E. Lee at Appomattox Court House on April 9, 1865. The war officially concluded with further surrenders across the Confederate armies and marked a profound transformation in American society, leading into the period known as Reconstruction, aimed at re-integrating the seceded states and abolishing slavery.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 10459,\n \"completion_tokens\": 309,\n \"total_tokens\": 10768,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-f709b10afe10f8e52425993b58e251a0.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-f709b10afe10f8e52425993b58e251a0.json deleted file mode 100644 index 4b44487..0000000 --- a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-f709b10afe10f8e52425993b58e251a0.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 23:58:50 GMT", - "Content-Type": "application\/json", - "Content-Length": "765", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-ALJ3xuMTKxEYmoZQsKpeSwsfdtAti\",\n \"object\": \"chat.completion\",\n \"created\": 1729641529,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"query\\\": \\\"\\\\\\\"American Civil War\\\\\\\" timeline 1861 \\\\\\\"Fort Sumter\\\\\\\" \\\\\\\"Bull Run\\\\\\\" \\\\\\\"Battle of Shiloh\\\\\\\" effects\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 353,\n \"completion_tokens\": 35,\n \"total_tokens\": 388,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-ff5f3fc0f8a597f498ab55b7f934f5f1.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-ff5f3fc0f8a597f498ab55b7f934f5f1.json deleted file mode 100644 index 56e6478..0000000 --- a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChain-ff5f3fc0f8a597f498ab55b7f934f5f1.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 23:59:26 GMT", - "Content-Type": "application\/json", - "Content-Length": "866", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-ALJ4XBVUCOJP47TDmq0z20WLj7bhl\",\n \"object\": \"chat.completion\",\n \"created\": 1729641565,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"query\\\": \\\"American Civil War summary timeline, Battle of Gettysburg 1863, General Grant's leadership, Sherman's March to the Sea, Confederate General Lee's surrender at Appomattox Court House 1865, post-war Reconstruction\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 553,\n \"completion_tokens\": 56,\n \"total_tokens\": 609,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainFirecrawlTool-073fd35020257fc589393e63f7775273.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainFirecrawlTool-073fd35020257fc589393e63f7775273.json deleted file mode 100644 index a87e71e..0000000 --- a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainFirecrawlTool-073fd35020257fc589393e63f7775273.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "X-Powered-By": "Express", - "Access-Control-Allow-Origin": "*" - }, - "data": "{\"success\":true,\"data\":{\"markdown\":\"We use cookies to understand how you use our site, improve your experience, and personalize content. To learn more, [click here](https:\/\/www.battlefields.org\/about\/accountability\/privacy-policy#cookies)\\n. By continuing to use our site, you accept our use of cookies, [Privacy Policy](https:\/\/www.battlefields.org\/about\/accountability\/privacy-policy)\\n, and [Terms of Service](https:\/\/www.battlefields.org\/terms-service)\\n.\\n\\nI agree [More info](https:\/\/www.battlefields.org\/about\/accountability\/privacy-policy#cookies)\\n Reject cookies\\n\\n[Skip to main content](#main-content)\\n\\n[My Library](\/learn\/educators\/my-library)\\n\\n ![This is an image depicting casualties on the Antietam battlefield. ](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/hero_large\/public\/thumbnails\/image\/Antietam%20Battle%20Page%20Hero_0.jpg?h=1a7cb72a&itok=XKHEKkMd)\\n\\nAntietam\\n========\\n\\nSharpsburg\\n----------\\n\\nWatch Antietam: Animated Battle Map\\n\\nClose Video\\n\\nAlso offered in: [Espa\u00f1ol](\/learn\/civil-war\/battles\/antietam-espanol)\\n\\nWashington County, MD\u00a0\u00a0|\u00a0\u00a0Sep 17, 1862\\n--------------------------------------\\n\\nAntietam, the deadliest one-day battle in American military history, showed that the Union could stand against the Confederate army in the Eastern theater. It also gave President Abraham Lincoln the confidence to issue the preliminary Emancipation Proclamation at a moment of strength rather than desperation.\\n\\n#### **How it ended**\\n\\nInconclusive. General Robert E. Lee committed his entire force to the battle, while Maj. Gen. George B. McClellan sent in less than three quarters of his. With the full commitment of McClellan\u2019s troops, which outnumbered the Confederates two to one, the battle might have had a more definitive outcome. Instead, McClellan\u2019s half-hearted approach allowed Lee to hold ground by shifting forces from threat to threat.\\n\\n#### **In context**\\n\\nLee invaded Maryland in September 1862 with a full agenda. He wanted to move the focus of fighting away from the South and into Federal territory. Victories there, could lead to the capture of the Federal capital in Washington, D.C. Confederate success could also influence impending Congressional elections in the North and persuade European nations to recognize the Confederate States of America. On the other side, President Abraham Lincoln was counting on McClellan to bring him the victory he needed to keep Republican control of the Congress and issue a preliminary Emancipation Proclamation.\\n\\nBefore the Battle\\n\\nThe first Confederate invasion of Union-held territory is not going as planned. After a Union victory at [the Battle of South Mountain](https:\/\/www.battlefields.org\/learn\/civil-war\/battles\/south-mountain)\\n and a Confederate victory at [the Battle of Harpers Ferry](https:\/\/www.battlefields.org\/learn\/civil-war\/battles\/harpers-ferry)\\n, Confederate general Robert E. Lee opts to make one last stand in the hopes of salvaging his Maryland Campaign.\\n\\nWith Federal forces closing in from the east, Lee selects strategic ground near Antietam Creek and orders his army to converge there. A mile east of the town of Sharpsburg, the creek meanders through the hilly but open countryside, good for long-range artillery and moving infantry. The water is deep, swift, and crossable only at three stone bridges, making it a natural defensible location. On September 15, Lee positions his men behind the creek and waits for McClellan to arrive.\\n\\nOn the afternoon of September 16, Union general George B. McClellan sets his army in motion, sending Maj. Gen. Joseph Hooker\u2019s First Corps across Antietam Creek to find Lee\u2019s left flank. At dusk, Hooker bumps into Confederate general John Bell Hood\u2019s division and the two forces skirmish until dark. The following morning, McClellan attacks.\\n\\nDuring the Battle\\n\\n[![Portrait of George B. McClellan](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/General%20George%20B%20McClellan%20Square.jpg?h=d8c3850d&itok=TwTCmLat)](\/learn\/biographies\/george-b-mcclellan)\\n\\nUnion\\n\\n[George B. McClellan](\/learn\/biographies\/george-b-mcclellan)\\n\\n[![Portrait of Robert E. Lee](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/Robert%20E.%20Lee.jpg?h=d8c3850d&itok=wdGXCQTD)](\/learn\/biographies\/robert-e-lee)\\n\\nConfederate\\n\\n[Robert E. Lee](\/learn\/biographies\/robert-e-lee)\\n\\nForces Engaged\\n\\n132,000\\n\\nUnion \\n87,000\\n\\nConfed. \\n45,000\\n\\nSeptember 17. The Battle of Antietam begins at dawn when Hooker\u2019s Union corps mounts a powerful assault on Lee\u2019s left flank. Repeated Union attacks and equally vicious Confederate counterattacks sweep back and forth across Miller\u2019s cornfield and the West Woods. Hooker sees thousands of his Federals felled in the corn rows, where, \u201cevery stalk of corn in the northern and greater part of the field was cut as closely as could have been done with a knife, and the slain lay in rows precisely as they had stood in their ranks a few moments before.\u201d Despite the great Union numerical advantage, Lt. Gen. Stonewall Jackson\u2019s Confederate forces hold their ground near the Dunker Church.\\n\\nMeanwhile, towards the center of the battlefield, Union assaults against the Sunken Road pierce the Confederate center after a terrible struggle for this key defensive position. Unfortunately for the Union, this temporal advantage in the center is not followed up with further advances and eventually the Union defenders must abandon their position.\\n\\nIn the afternoon, the third and final major assault by Maj. Gen. Ambrose E. Burnside's Ninth Corps pushes over a bullet-strewn stone bridge at Antietam Creek. (Today it\u2019s called Burnside Bridge.) Just as Burnside's forces begin to collapse the Confederate right, Maj. Gen. A.P. Hill\u2019s division charges into battle after a long march from Harpers Ferry, helping drive back the assault and saving the day for the Army of Northern Virginia.\\n\\nAftermath\\n\\nUnion\\n\\n12,401\\n\\n2,108 killed\\n\\n9,540 wounded\\n\\n753 missing & captured\\n\\nEstimated Casualties\\n\\n22,717\\n\\nUnion \\n12,401\\n\\nConfed. \\n10,316\\n\\nConfederate\\n\\n10,316\\n\\n1,546 killed\\n\\n7,752 wounded\\n\\n1,018 missing & captured\\n\\nThere are more than 22,000 casualties at the Battle of Antietam. Doctors at the scene are overwhelmed. Badly needed supplies are brought in by nurse Clara Barton, known as the \u201cAngel of the Battlefield.\u201d During the night, both armies tend their wounded and consolidate their lines. In spite of his diminished ranks, Lee continues to skirmish with McClellan on September 18, while removing his wounded south of the Potomac River. Late that evening and on September 19, after realizing that no further attacks are coming from McClellan, Lee withdraws from the battlefield and slips back across the Potomac into Virginia. McClellan sends Maj. Gen. Fitz John Porter to mount a cautious pursuit, which is repulsed at [the Battle of Shepherdstown](https:\/\/www.battlefields.org\/learn\/civil-war\/battles\/shepherdstown)\\n.\\n\\nWhile the Battle of Antietam is considered a tactical draw, President Lincoln claims a strategic victory. Lincoln has been waiting for a military success to issue his preliminary [Emancipation Proclamation](https:\/\/www.battlefields.org\/learn\/articles\/10-facts-emancipation-proclamation)\\n. He takes his opportunity on September 22. The Proclamation, which vows to free the slaves of all states still in rebellion as of January 1, 1863, will forever change the course of the war and the nation by marrying the Union cause with an attack on the institution of slavery. Hesitant to support a pro-slavery regime, England and France decline to form an alliance with the Confederate States of America.\\n\\nAfter McClellan fails to pursue Lee on his retreat south, Lincoln loses faith in his general. Weeks later, he names Burnside commander of the Army of the Potomac.\\n\\nQuestions to Consider\\n\\n1\\\\. Why did Lincoln lose faith in George McClellan\u2019s command after Antietam?\\n\\nLincoln and McClellan had a tortured relationship. McClellan\u2019s letters reveal his contempt for his commander-in-chief (whom he sometimes referred to as \u201cthe Gorilla\u201d), and the historical record shows that as the war slogged on, Lincoln became increasingly frustrated with his general\u2019s timidity and excuses. He believed McClellan spent too much of his command drilling troops and little of it pursuing Lee. Lincoln called the general\u2019s \u201ccondition\u201d a bad case of \u201cthe slows.\u201d\\n\\nThough well-liked by his men, McClellan could be vain and boastful. After he failed to attack Lee\u2019s depleted troops as they fled Sharpsburg on September 18, he wrote to his wife, Ellen, that, ''those in whose judgment I rely tell me that I fought the battle splendidly & that it was a masterpiece of art.''\u00a0 Lincoln disagreed. He could not understand why his general was not on the tail of the Confederates, and he went to McClellan\u2019s headquarters at Antietam to light a fire under him. In a letter to his wife, Mary, Lincoln joked, \u201cWe are about to be photographed. . . \\\\[if\\\\] we can sit still long enough. I feel Gen. M. should have no problem.\u201d\\n\\nSix weeks after Antietam, McClellan finally heeded his boss\u2019s advice and led the Army of the Potomac into Virginia, but at a snail\u2019s pace. Even before the nine-day trek, Lincoln had all but given up on the man who had once been christened \u201cYoung Napoleon\u201d for his military promise. The president relieved McClellan of his duties on November 7 and appointed Maj. Gen. Ambrose Burnside to be his replacement.\\n\\nAfter losing his command, McClellan took up a new career\u2014politics. In the 1864 election he was the Democratic nominee for president of the United States. His opponent, Abraham Lincoln, was reelected for another term.\\n\\n2\\\\. Why is nurse Clara Barton considered a hero of Antietam?\\n\\nClarissa \u201cClara\u201d Harlowe Barton was a former teacher and patent clerk who became a nurse on the front lines during the Civil War. Despite having no prior experience and receiving no payment for her services, she bravely drove her cart of medical supplies into the fray at many battles, including Antietam. She saw the desperation of the wounded and dying and did what she could to aid and comfort them. Dr. James Dunn, a surgeon at the Battle of Antietam lauded her efforts:\\n\\nThe rattle of 150,000 muskets, and the fearful thunder of over 200 cannon, told us that the great battle of Antietam had commenced. I was in the hospital in the afternoon, for it was then only that the wounded began to come in. We had expended every bandage, tore up every sheet in the house, and everything we could find, when who should drive up but our old friend, Miss Barton, with a team loaded down with dressings of every kind, and everything we could ask for. . . .In my feeble estimation, General McClellan, with all his laurels, sinks into insignificance beside the true heroine of the age, _the angel of the battle field_.\\n\\nLater in the war, Lincoln authorized Barton to form the Office of Correspondence with Friends of Missing Men in the United States Army, an effort that eventually identified 22,000 missing Union soldiers. In 1881 Barton founded the American Red Cross.\\n\\nAntietam: Featured Resources\\n----------------------------\\n\\n[![Two trees set against a vivid purple sky at Antietam National Battlefield](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/Antietam_BuddySecor_1E2A9575-Antietam-%28Secor-2017%29-HiRez.jpg?h=89182231&itok=_LxpqldD)](\/learn\/quizzes\/how-well-do-know-battle-antietam)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Quiz](\/search?algolia_search_index[refinementList][field_resource_type][]=quiz)\\n\\n### [How Well Do Know the Battle of Antietam?](\/learn\/quizzes\/how-well-do-know-battle-antietam)\\n\\n[![Photograph of McClellan discussing business in a tent](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/ls_0.jpg?h=a4080807&itok=fhoiquCF)](\/learn\/articles\/mcclellan-antietam)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Article](\/search?algolia_search_index[refinementList][field_resource_type][]=article)\\n\\n### [McClellan at Antietam](\/learn\/articles\/mcclellan-antietam)\\n\\n[![](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/Antietam_Elliot_Map_Segment_0.jpg?h=8dd85f47&itok=Gm_KIKQI)](\/learn\/articles\/nineteenth-century-geolocation-elliott-map-antietam)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Article](\/search?algolia_search_index[refinementList][field_resource_type][]=article)\\n\\n### [Nineteenth-Century Geolocation: The Elliott Map of Antietam](\/learn\/articles\/nineteenth-century-geolocation-elliott-map-antietam)\\n\\n[![Screenshot of the Antietam animated map](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/Screen%20Shot%202017-04-04%20at%2011.53.15%20AM.png?h=ad937be1&itok=lQBmQ62R)](\/learn\/maps\/antietam-animated-map)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Video](\/search?algolia_search_index[refinementList][field_resource_type][]=video)\\n\\n### [Antietam Animated Map](\/learn\/maps\/antietam-animated-map)\\n\\n[![A portrait of Abraham Lincoln bordered by two American flags](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/Emancipation%20Proclamation%2010%20Facts.jpg?h=d86166dc&itok=4hGdn5CI)](\/learn\/articles\/10-facts-emancipation-proclamation)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Article](\/search?algolia_search_index[refinementList][field_resource_type][]=article)\\n\\n### [10 Facts: The Emancipation Proclamation](\/learn\/articles\/10-facts-emancipation-proclamation)\\n\\n[![Photograph of the train and bridge at Harper's Ferry](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/Harpers%20Ferry%20Hero.jpg?h=d86166dc&itok=XSRICoSZ)](\/learn\/civil-war\/battles\/harpers-ferry)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Battle](\/search?type[]=battle)\\n\\n### [Harpers Ferry](\/learn\/civil-war\/battles\/harpers-ferry)\\n\\n[![A distant photograph of Dunker Church at Antietam](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/Artillery%20Hell%20at%20the%20Dunker%20Church_1.jpg?h=d7680848&itok=Q2bcSAJC)](\/learn\/articles\/antietam-federal-flank-attack-dunker-church)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Article](\/search?algolia_search_index[refinementList][field_resource_type][]=article)\\n\\n### [Antietam: Federal Flank Attack at Dunker Church](\/learn\/articles\/antietam-federal-flank-attack-dunker-church)\\n\\n[![This is an image of the Antietam App icon.](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/antietam-landscape.jpg?h=a4080807&itok=GNFrqfNJ)](\/visit\/mobile-apps\/antietam-battle-app)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Mobile App](\/search?algolia_search_index[refinementList][field_resource_type][]=mobile_app)\\n\\n### [Antietam Battle App](\/visit\/mobile-apps\/antietam-battle-app)\\n\\n[![Cover of the \\\"Long Road to Antietam\\\"](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/Long-Road-To-Antietam-%28Landscape%29.jpg?h=a4080807&itok=w4jLXDfv)](\/learn\/articles\/book-long-road-antietam)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Article](\/search?algolia_search_index[refinementList][field_resource_type][]=article)\\n\\n### [Book: The Long Road to Antietam](\/learn\/articles\/book-long-road-antietam)\\n\\n[![](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/Antietam_MattBrant_DunkerChurch_FromWestWoods_BW.jpg?h=5234f34a&itok=7UqDyn0c)](\/learn\/articles\/lessons-fallen-depictions-dead-antietam)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Article](\/search?algolia_search_index[refinementList][field_resource_type][]=article)\\n\\n### [Lessons From the Fallen: Depictions of the Dead of Antietam](\/learn\/articles\/lessons-fallen-depictions-dead-antietam)\\n\\n[![](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/Antietam_Elliot_Map_Segment_0.jpg?h=8dd85f47&itok=Gm_KIKQI)](\/learn\/maps\/antietam-sg-elliott-burial-map)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Historical Map](\/search?algolia_search_index[refinementList][field_resource_type][]=history_map)\\n\\n### [Antietam - S.G. Elliott Burial Map](\/learn\/maps\/antietam-sg-elliott-burial-map)\\n\\n[![Antietam | Sunken Road | Sep 17, 1862 | 9:30 am - 1:00 pm](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/Antietam_sunken-road_930-am-to-1pm_Sept-17-1862-%28August-2023%29.jpg?h=a4e5fa57&itok=xmbHsrRt)](\/learn\/maps\/antietam-sunken-road-sep-17-1862)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Battle Map](\/search?algolia_search_index[refinementList][field_resource_type][]=battle_map)\\n\\n### [Antietam | Sunken Road | Sep 17, 1862](\/learn\/maps\/antietam-sunken-road-sep-17-1862)\\n\\n[![Antietam | Burnside's Bridge | Sep 17, 1862 | 12:00 - 1:00 pm](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/Antietam_burnside-bridge_noon-to-1pm_Sept-17-1862-%28August-2023%29.jpg?h=08d962ad&itok=aI7956JL)](\/learn\/maps\/antietam-burnsides-bridge-sep-17-1862)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Battle Map](\/search?algolia_search_index[refinementList][field_resource_type][]=battle_map)\\n\\n### [Antietam | Burnside's Bridge | Sep 17, 1862](\/learn\/maps\/antietam-burnsides-bridge-sep-17-1862)\\n\\n[![This is a sketch of Union soldiers lined up and ready for battle. ](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/default-history-troops_0.jpg?h=fc321e16&itok=Poka9YqY)](\/learn\/articles\/antietam)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Article](\/search?algolia_search_index[refinementList][field_resource_type][]=article)\\n\\n### [Antietam](\/learn\/articles\/antietam)\\n\\n[Antietam: Search All Resources](\/search?algolia_search_index[refinementList][title_2][]=Antietam)\\n\\nAll battles of the Maryland Campaign\\n------------------------------------\\n\\n1\\n\\n2\\n\\n3\\n\\n4\\n\\n5\\n\\n500 km\\n\\n300 mi\\n\\n[+](# \\\"Zoom in\\\")\\n[\u2212](# \\\"Zoom out\\\")\\n\\n[](# \\\"View Fullscreen\\\")\\n\\n[Leaflet](http:\/\/leafletjs.com \\\"A JS library for interactive maps\\\")\\n\\nClick to view and interact with the map\\n\\n[Full Civil War Map](\/learn\/battles?historical_period=71)\\n\\n1\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Battle](\/search?type[]=battle)\\n\\nHarpers Ferry\\n\\nJefferson County, WV\u00a0\u00a0|\u00a0\u00a0Sep 12\u00a0-\u00a015, 1862\\n\\n**Result:** Confederate Victory \\n**Est. Casualties:** 12,922 \\n**Union:** 12,636 \\n**Confederate:** 286 \\n\\n2\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Battle](\/search?type[]=battle)\\n\\nSouth Mountain\\n\\nFrederick County and Washington County, MD\u00a0\u00a0|\u00a0\u00a0Sep 14, 1862\\n\\n**Result:** Union Victory \\n**Est. Casualties:** 5,010 \\n**Union:** 2,325 \\n**Confederate:** 2,685 \\n\\n3\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Battle](\/search?type[]=battle)\\n\\nLa batalla de Antietam\\n\\nWashington County, MD\u00a0\u00a0|\u00a0\u00a0Sep 16\u00a0-\u00a018, 1862\\n\\n**Result:** Union Victory \\n**Est. Casualties:** 22,717 \\n**Union:** 12,401 \\n**Confederate:** 10,316 \\n\\n4\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Battle](\/search?type[]=battle)\\n\\nAntietam\\n\\nWashington County, MD\u00a0\u00a0|\u00a0\u00a0Sep 17, 1862\\n\\n**Result:** Union Victory \\n**Est. Casualties:** 22,717 \\n**Union:** 12,401 \\n**Confederate:** 10,316 \\n\\n5\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[Battle](\/search?type[]=battle)\\n\\nShepherdstown\\n\\nTown of Shepherdstown, WV\u00a0\u00a0|\u00a0\u00a0Sep 19\u00a0-\u00a020, 1862\\n\\n**Result:** Confederate Victory \\n**Est. Casualties:** 622 \\n**Union:** 361 \\n**Confederate:** 261 \\n\\nAdd to My Battlefields Educators Library\\n\\nRelated Battles\\n---------------\\n\\n[Battle Facts](\/learn\/civil-war\/battles\/antietam)\\n\\nWashington County, MD | September 17, 1862\\n\\nResult: Union Victory\\n\\nCommanders\\n\\n[![Portrait of George B. McClellan](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/General%20George%20B%20McClellan%20Square.jpg?h=d8c3850d&itok=TwTCmLat)](\/learn\/biographies\/george-b-mcclellan)\\n\\nUnion\\n\\n[George B. McClellan](\/learn\/biographies\/george-b-mcclellan)\\n\\n[![Portrait of Robert E. Lee](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/Robert%20E.%20Lee.jpg?h=d8c3850d&itok=wdGXCQTD)](\/learn\/biographies\/robert-e-lee)\\n\\nConfederate\\n\\n[Robert E. Lee](\/learn\/biographies\/robert-e-lee)\\n\\nForces Engaged\\n\\n132,000\\n\\nUnion \\n87,000\\n\\nConfed. \\n45,000\\n\\nEstimated Casualties\\n\\n22,717\\n\\nUnion \\n12,401\\n\\nConfed. \\n10,316\\n\\n[![This is an image of the Antietam battlefield at sunset. ](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/Antietam%20Battlefield%20Hero.jpg?h=d86166dc&itok=BlXSTN4V)](\/visit\/battlefields\/antietam-battlefield)\\n\\n### [Visit Antietam](\/visit\/battlefields\/antietam-battlefield)\\n\\nWidely considered to be one of the most beautiful, pristine and well-preserved Civil War battlefields, Antietam is a must-see for any Civil War...\\n\\n[Details and Itineraries \u00bb](\/visit\/battlefields\/antietam-battlefield)\\n\\n[![Photograph of the stone bridge at Antietam](https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/squarish\/public\/thumbnails\/image\/Antietam%20360%20Hero.jpg?h=d86166dc&itok=FXc7cL4N)](\/visit\/virtual-tours\/antietam-360-virtual-tour)\\n\\n[Civil War](\/search?algolia_search_index[refinementList][title_1][]=71)\\n\u00a0\u00a0|\u00a0\u00a0[360\u00b0 Virtual Tour](\/search?type[]=virtual_tour)\\n\\n### [Antietam Virtual Tour](\/visit\/virtual-tours\/antietam-360-virtual-tour)\\n\\n![](https:\/\/t.co\/i\/adsct?bci=3&eci=2&event_id=c863ea1b-7bc5-40a5-96f8-116e853271b1&events=%5B%5B%22pageview%22%2C%7B%7D%5D%5D&integration=advertiser&p_id=Twitter&p_user_id=0&pl_id=dafbb5fc-3616-4b28-8370-12d1c2c33328&tw_document_href=https%3A%2F%2Fwww.battlefields.org%2Flearn%2Fcivil-war%2Fbattles%2Fantietam&tw_iframe_status=0&tw_order_quantity=0&tw_sale_amount=0&txn_id=ny98u&type=javascript&version=2.3.30)![](https:\/\/analytics.twitter.com\/i\/adsct?bci=3&eci=2&event_id=c863ea1b-7bc5-40a5-96f8-116e853271b1&events=%5B%5B%22pageview%22%2C%7B%7D%5D%5D&integration=advertiser&p_id=Twitter&p_user_id=0&pl_id=dafbb5fc-3616-4b28-8370-12d1c2c33328&tw_document_href=https%3A%2F%2Fwww.battlefields.org%2Flearn%2Fcivil-war%2Fbattles%2Fantietam&tw_iframe_status=0&tw_order_quantity=0&tw_sale_amount=0&txn_id=ny98u&type=javascript&version=2.3.30)\\n\\n![](https:\/\/bat.bing.com\/action\/0?ti=142000833&Ver=2&mid=0df38fd2-37eb-4c27-b0f9-126134244ee7&bo=1&sid=99f5a55090d111efab6071f134391ce9&vid=99f5e7e090d111efbfccf93e7a9f88d2&vids=1&msclkid=N&pi=918639831&lg=en-US&sw=1280&sh=1024&sc=24&tl=Antietam%20Battle%20Facts%20and%20Summary%20%7C%20American%20Battlefield%20Trust&p=https%3A%2F%2Fwww.battlefields.org%2Flearn%2Fcivil-war%2Fbattles%2Fantietam&r=<=1679&evt=pageLoad&sv=1&cdb=AQAA&rn=543974)\",\"metadata\":{\"title\":\"Antietam Battle Facts and Summary | American Battlefield Trust\",\"description\":\"Battle of Antietam page - battle maps, history articles, photos, and preservation news on this important 1862 Civil War battle in Maryland.\",\"language\":\"en\",\"robots\":\"index, follow\",\"ogTitle\":\"Antietam\",\"ogDescription\":\"Battle of Antietam page - battle maps, history articles, photos, and preservation news on this important 1862 Civil War battle in Maryland.\",\"ogUrl\":\"https:\/\/www.battlefields.org\/learn\/civil-war\/battles\/antietam\",\"ogImage\":\"https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/social_media\/public\/thumbnails\/image\/Antietam%20Battlefield%20Hero.jpg?h=26133ae9&itok=S05zXtkM\",\"ogLocaleAlternate\":[],\"ogSiteName\":\"American Battlefield Trust\",\"geo.position\":\"39.473125723648;-77.74491010581\",\"geo.region\":\"US-MD\",\"og:site_name\":\"American Battlefield Trust\",\"og:type\":\"website\",\"og:url\":\"https:\/\/www.battlefields.org\/learn\/civil-war\/battles\/antietam\",\"og:title\":\"Antietam\",\"og:description\":\"Battle of Antietam page - battle maps, history articles, photos, and preservation news on this important 1862 Civil War battle in Maryland.\",\"og:image\":\"https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/social_media\/public\/thumbnails\/image\/Antietam%20Battlefield%20Hero.jpg?h=26133ae9&itok=S05zXtkM\",\"og:image:width\":\"857\",\"og:image:height\":\"450\",\"og:image:alt\":\"This is an image of the Antietam battlefield at sunset.\",\"place:location:latitude\":\"39.473125723648\",\"place:location:longitude\":\"-77.74491010581\",\"og:locality\":\"Sharpsburg\",\"og:region\":\"MD\",\"og:postal_code\":\"21782\",\"fb:pages\":\"21813808850\",\"twitter:card\":\"summary_large_image\",\"twitter:description\":\"Battle of Antietam page - battle maps, history articles, photos, and preservation news on this important 1862 Civil War battle in Maryland.\",\"twitter:site\":\"@battlefields\",\"twitter:title\":\"Antietam\",\"twitter:site:id\":\"25512685\",\"twitter:image:alt\":\"This is an image of the Antietam battlefield at sunset.\",\"viewport\":\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\",\"og:image:secure_url\":\"https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/social_media\/public\/thumbnails\/image\/Antietam%20Battlefield%20Hero.jpg?h=26133ae9&itok=S05zXtkM\",\"twitter:image\":\"https:\/\/www.battlefields.org\/sites\/default\/files\/styles\/social_media\/public\/thumbnails\/image\/Antietam%20Battlefield%20Hero.jpg?h=26133ae9&itok=S05zXtkM\",\"sourceURL\":\"https:\/\/www.battlefields.org\/learn\/civil-war\/battles\/antietam\",\"statusCode\":200}}}" -} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainFirecrawlTool-7b2933b3fa7351d076f3f06764a92c50.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainFirecrawlTool-7b2933b3fa7351d076f3f06764a92c50.json deleted file mode 100644 index 7275d40..0000000 --- a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainFirecrawlTool-7b2933b3fa7351d076f3f06764a92c50.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "X-Powered-By": "Express", - "Access-Control-Allow-Origin": "*" - }, - "data": "{\"success\":true,\"data\":{\"markdown\":\"* [Skip to global NPS navigation](#GlobalNav-toggle)\\n \\n* [Skip to this park navigation](#LocalNav-desktop-nav)\\n \\n* [Skip to the main content](#main)\\n \\n* [Skip to this park information section](#ParkFooter)\\n \\n* [Skip to the footer section](#GlobalFooter)\\n \\n\\n [![](https:\/\/www.nps.gov\/theme\/assets\/dist\/images\/branding\/logo.png) National Park Service](\/)\\n [Search](#GlobalFooterSearch)\\n\\nSearch\\n\\nThis Site All NPS\\n\\n \\n\\n* [Info](\/gett\/planyourvisit\/basicinfo.htm)\\n \\n* [Alerts 1](\/gett\/planyourvisit\/conditions.htm)\\n \\n* [Maps](\/gett\/planyourvisit\/maps.htm)\\n \\n* [Calendar](\/gett\/planyourvisit\/calendar.htm)\\n \\n* [Fees](\/gett\/planyourvisit\/fees.htm)\\n \\n\\n1 alert notifications\\n\\nAlerts In Effect\\n----------------\\n\\nDismiss\\n\\n### Park Closures\\n\\n* #### Rose Farm Rehabilitation Project Closure Notice\\n \\n Alert 1, Severity closure, Rose Farm Rehabilitation Project Closure Notice\\n \\n As of May 3, 2023, the Rose Farm & Rose Lane are closed to all visitation. The house will undergo a full rehabilitation. This work prohibits the use of the area around the house and lane during construction. Worker safety and resource protection are key.\\n \\n\\n[more information on current conditions...](\/gett\/planyourvisit\/conditions.htm)\\n\\nDismiss [View all alerts](\/gett\/planyourvisit\/conditions.htm)\\n\\nCivil War Timeline\\n==================\\n\\n ![Greyscale political cartoon from 1860 showing four men tearing apart a map of the United States.](https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/1860-Election-Cartoon.jpg?maxwidth=1300&autorotate=false%20%221860%20Election%20Cartoon%22)\\n\\nA political cartoon from 1860 shows the four candidates, from left, Lincoln, Douglas, Breckenridge, and Bell tearing apart the United States.\\n\\nLibrary of Congress\\n\\n1860\\n----\\n\\n**November 6, 1860-** The American people elect Abraham Lincoln as sixteenth president of the United States. Lincoln is the first Republican president in the nation and represents a party that opposes the spread of slavery into the territories of the United States. \\n \\n**December 17, 1860-** The first state Secession Convention meets in Columbia, South Carolina. \\n \\n**December 20, 1860-** South Carolina secedes from the United States.\\n\\n ![Color illustration of cannons flying in arcs over the ocean to a stone fort.](https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/Ft-Sumter_1.jpg?maxwidth=1300&autorotate=false%20%22Bombardment%20of%20Ft.%20Sumter%22)\\n\\nOn April l12, 1861 Confederates in South Carolina fired on Fort Sumter, starting the American Civil War.\\n\\nLibrary of Congress\\n\\n1861\\n----\\n\\n**January 1861-** Mississippi, Florida, Alabama, Georgia, Louisiana, and Texas secede from the United States. \\n \\n**February 4, 1861-** The southern states that had seceded assemble delegates at Montgomery, Alabama to organize the Confederate States of America. The delegates are tasked with drafting a Confederate Constitution and establishing a provisional government. \\n \\n**February 18, 1861-** The delegates at the Montgomery Convention appoint Jefferson Davis as provisional President of the Confederate States of America at Montgomery, Alabama, a position he will hold until elections can be arranged. \\n \\n**March 4, 1861-** Abraham Lincoln is inaugurated as the sixteenth president of the United States in Washington, DC. \\n \\n**March 11, 1861-** Confederate delegates in Montgomery approve the Constitution of the Confederate States of America. \\n \\n**April 12, 1861-** Confederate forces fire upon [Fort Sumter, South Carolina](https:\/\/www.nps.gov\/fosu)\\n. The Civil War formally begins. \\n \\n**April 15, 1861-** President Lincoln issues a public declaration that an insurrection exists and calls for 75,000 militia to stop the rebellion. As a result of this call for volunteers, Virginia, Arkansas, North Carolina, and Tennessee secede from the Union in the following weeks. Lincoln will respond on May 3 with an additional call for 43,000+ volunteers to serve for three years, expanding the size of the Regular Army. \\n \\n**May 24, 1861-** United States forces cross the Potomac River and occupy Arlington Heights, the home of future Confederate General Robert E. Lee. It is during the occupation of nearby Alexandria that Colonel Elmer Ellsworth, commander of the 11th New York Infantry and a close friend of the Lincolns, is shot dead by the owner of the Marshall House just after removing a Confederate flag from its roof. Ellsworth is the first US officer killed in the war. \\n \\n**Late May, 1861-** Richmond becomes the capitol of the Confederacy. Richmond was the Confederacy's second largest and most industrialized city. \\n \\n**June 3, 1861-** A skirmish near Philippi in western Virginia, is the first clash of United States and Confederate forces in the east. \\n \\n**June 10, 1861-** Battle of Big Bethel, the first land battle of the war in Virginia. \\n \\n**June 20, 1861-** At the culmination of the Wheeling Convention, the northwestern counties of Virginia broke away from that state to form West Virginia. West Virginia will be officially designated and accepted as the 35th state of the Union on June 20, 1863. \\n \\n**July 21, 1861-** The [Battle of Bull Run (or First Manassas),](https:\/\/www.nps.gov\/mana)\\n is fought near Manassas, Virginia. The Union Army under General Irwin McDowell initially succeeds in driving back Confederate forces under General Pierre Gustav Toutant Beauregard, but the arrival of troops under General Joseph E. Johnston initiates a series of reverses that sends McDowell's army in a panicked retreat to the defenses of Washington. \\n \\n**July 1861-** To thwart the Confederate threat in northern Virginia, a series of [earthworks and forts are engineered to surround the City of Washington](https:\/\/www.nps.gov\/cwdw)\\n, adding to protection already offered by active posts such as [Fort Washington](https:\/\/www.nps.gov\/fowa)\\n on the Potomac River. \\n \\n**August 6, 1861-** US Congress passes and President Lincoln signs the Confiscation Act of 1861. This act permits court proceedings for the confiscation of property, including enslaved people, used to support the Confederacy. \\n \\n**August 10, 1861-** At the [Battle of Wilson's Creek, Missouri](https:\/\/www.nps.gov\/wicr)\\n the United States Army under General Nathaniel Lyon attacks Confederate troops and state militia southwest of Springfield, Missouri. After a disastrous day that included the death of Lyon, Confederate forces repel the Federal attack. The defeat emphasizes to US leaders the strong Confederate presence west of the Mississippi River. \\n \\n**August 28-29, 1861-** Fort Hatteras at Cape Hatteras, North Carolina, falls to United States naval forces. This begins the first Federal efforts to close Southern ports along the Carolina coast. \\n \\n**September 20, 1861-** Lexington, Missouri falls to Confederate forces under Sterling Price. \\n \\n**October 21, 1861-** Battle of Ball's Bluff, Virginia. Colonel Edward D. Baker, senator from Oregon and a friend of President Lincoln, led troops across the Potomac River only to be forced back to the river's edge where he was killed. The ensuing Union withdrawal turned into a rout with many soldiers drowning while trying to re-cross the icy waters of the Potomac River. \\n \\n**November 1, 1861-** President Lincoln appoints General George B. McClellan as General-in-Chief of all United States armies.\\n\\n ![Historical black and white photograph of a group of Black people, including men on horses and a woman on a wagon pulled by oxen crossing a low river while watched by white US soldier.](https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/Enslaved-People-Fording-Rappahanock.jpg?maxwidth=1300&autorotate=false%20%22Enslaved%20People%20Fording%20Rappahanock%22)\\n\\nIn the summer of 1862, enslaved people crossed into Federal lines seeking freedom. Over the course of the Civil War, US policy and war aims evolved, ultimately to include the abolition of slavery.\\n\\nLibrary of Congress\\n\\n1862\\n----\\n\\n**January 19, 1862-** Battle of Mill Springs, Kentucky. This Federal victory weakened the Confederate hold on the state. \\n \\n**February 6, 1862-** Surrender of Fort Henry, Tennessee. The loss of this southern fort on the Tennessee River opened the door to Federal control of the river. \\n \\n**February 8, 1862-** Battle of Roanoke Island, North Carolina. A Confederate defeat, the battle resulted in US occupation of eastern North Carolina and control of Pamlico Sound, to be used as Northern base for further operations against the southern coast. \\n \\n**February 16, 1862-** [Surrender of Fort Donelson, Tennessee](https:\/\/www.nps.gov\/fodo)\\n. This critical fort on the Cumberland River left the river in Federal control. It was here that US General Ulysses S. Grant gained his nickname \\\"Unconditional Surrender\\\" Grant. \\n \\n**February 22, 1862-** Jefferson Davis is inaugurated as President of the Confederate States of America. \\n \\n**March 7-8, 1862-** [Battle of Pea Ridge (Elkhorn Tavern), Arkansas.](https:\/\/www.nps.gov\/peri)\\n The US victory here loosened the Confederate hold on Missouri and disrupted southern control of a portion of the Mississippi River. \\n \\n**March 8-9, 1862-** The Battle of Hampton Roads pits USS Monitor and the CSS Virginia (the old USS Merrimack), the first ironclads, against one another off the Virginia coast. On March 8, the CSS Virginia destroys two wooden-hulled Federal ships. On March 9, the USS Monitor arrived and the two ironclads fought for hours, neither inflicting much damage on the other. \\n \\n**April 6-7, 1862-** [The Battle of Shiloh (Pittsburg Landing),](https:\/\/www.nps.gov\/shil)\\n the first major battle in Tennessee. Confederate General Albert Sidney Johnston, a veteran of the Texas War of Independence and the War with Mexico considered to be one of the finest officers in the Confederacy, is killed on the first day of fighting. The Federal victory further secures the career of US General Ulysses S. Grant. \\n \\n**April 24-25, 1862-** A Federal fleet of gunships under Admiral David Farragut passes Confederate forts guarding the mouth of the Mississippi River. On April 25, the fleet arrived at New Orleans where they demanded the surrender of the city. Within two days the forts fall to Federal forces and the mouth of the great river is under United States control. \\n \\n**May 25, 1862-** First Battle of Winchester, Virginia. After two weeks of maneuvering and battles at Cross Keys and Front Royal, Confederate General \\\"Stonewall\\\" Jackson attacks US forces at Winchester and successfully drives them from the city. The victory is the culmination of his 1862 Valley Campaign. \\n \\n**May 31-June 1, 1862-** [The Battle of Seven Pines near Richmond, Virginia.](https:\/\/www.nps.gov\/rich)\\n General Joseph Johnston, commander of the Confederate army in Virginia is wounded and replaced by Robert E. Lee who renames his command the \\\"Army of Northern Virginia\\\". \\n \\n**June 6, 1862-** Battle of Memphis, Tennessee. A US flotilla under Commodore Charles Davis successfully defeats a Confederate river force on the Mississippi River near the city and Memphis surrenders. The Mississippi River is now in Federal control except for its course west of Mississippi where the city of Vicksburg stands as the last Confederate stronghold on the great river. \\n \\n**June 25-July 1, 1862-** [The Seven Days' Battles before Richmond](https:\/\/www.nps.gov\/rich)\\n. General Lee's army attacks the US Army of the Potomac under General George McClellan in a succession of battles beginning at Mechanicsville on June 26 and ending at Malvern Hill on July 1. \\n \\n**July 17, 1862-** President Lincoln approves the Confiscation Act of 1862, or Second Confiscation Act. This act expands the terms of the previous Confiscation Act, allows broader seizure of Confederate property, the emancipation of enslaved people in Federally occupied territory, and prohibits the return of fugitive slaves. \\n \\n**August 30-31, 1862-** The [Battle of Second Bull Run (or Second Manassas)](https:\/\/www.nps.gov\/mana)\\n is fought on the same ground where one year before, the United States army was defeated and sent reeling in retreat to Washington. Likewise, the result of this battle is a US defeat. \\n \\n**September 17, 1862-** [The Battle of Antietam (or Sharpsburg), Maryland,](https:\/\/www.nps.gov\/anti)\\n the bloodiest single day of the Civil War. The result of the battle ends Confederate General Lee's first invasion of the North. \\n \\n**September 22, 1862-** Following the US victory at Antietam, President Lincoln introduces the Preliminary Emancipation Proclamation, which announced Lincoln's intention to declare all enslaved people free on January 1, 1863 if those places remained in rebellion at that time. \\n \\n**December 11-15, 1862-** [The Battle of Fredericksburg, Virginia](https:\/\/www.nps.gov\/frsp)\\n. The Confederate Army of Northern Virginia, under General Lee, wins a lopsided victory over the US Army of the Potomac, under General Ambrose Burnside, after Federal forces conducted a risky river crossing in an attempt to win a victory on Confederate soil before the release of Emancipation Proclamation. \\n \\n**December 24, 1862-** Jefferson Davis writes an order declaring US General Benjamin Butler to be an outlaw for his treatment of the civilians of New Orleans. Included in this proclamation is a statement that Lincoln's upcoming Emancipation Proclamation is designed to \\\"excite servile war\\\" and that any black US soldiers or their white officers are to be sent to the individual states instead of being treated as prisoners of war. \\n \\n**December 31-January 3, 1863-** [Battle of Stones River, Tennessee](https:\/\/www.nps.gov\/srnc)\\n. Fought between the US Army of the Cumberland under General William Rosecrans and the Confederate Army of Tennessee under General Braxton Bragg, the costly Federal victory frees middle Tennessee from Confederate control and boosts Northern morale.\\n\\n ![Historical black and white photograph of flat, open field with scattered dead bodies.](https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/Gettysburg-Dead.jpg?maxwidth=1300&autorotate=false%20%22Gettysburg%20Dead%22)\\n\\nAs casualties mounted, battlefield photography displayed the awful spectacle of battle to an American public that had largely romanticized war at the beginning of the conflict.\\n\\nLibrary of Congress\\n\\n1863\\n----\\n\\n**January 1, 1863-** The Emancipation Proclamation goes into effect. The Emancipation Proclamation was a war measure that declared enslaved people in rebelling states to be free, authorized the enlistment of black troops, and outraged white Southerners. The proclamation was an important turning point in the war for the United States and in the eventual shift from the goal of restoring the Union as it was, to building a better Union without slavery. \\n \\n**March 3, 1863-** Conscription, or the drafting of soldiers into military service, begins in the North. It had begun in the Confederacy the year before. \\n \\n**April 1863-** Federal forces in the east begin a new campaign in Virginia to flank Lee's Army of Northern Virginia at Fredericksburg. In the west, a Federal army has begun a campaign to surround and take Vicksburg, Mississippi, the last Confederate stronghold on the Mississippi River. \\n \\n**April 30-May 6, 1863-** [Battle of Chancellorsville, Virginia.](https:\/\/www.nps.gov\/frsp)\\n US General Joseph Hooker's plan to flank Lee falls apart and Union forces retreat. Lee's victory at Chancellorsville is marred by high casualties, including the mortal wounding of \\\"Stonewall\\\" Jackson, who dies on May 10. Soon after, Lee asks Jefferson Davis for permission to invade the North and take the war out of Virginia. \\n \\n**May 1, 1863-** The Confederate Congress passes a Retaliatory Act in line Jefferson Davis' earlier proclamation and in response to the Emancipation Proclamation. The act establishes that the Confederacy considers the enlistment of black troops to be the equivalent of inciting a servile rebellion, white officers of black troops are to be executed, and black troops taken prisoner are to be sent to the states, where they could be executed or re-enslaved. \\n \\n**May 18, 1863-** [Siege of Vicksburg, Mississippi](https:\/\/www.nps.gov\/vick\/index.htm)\\n begins. US forces under General Ulysses S. Grant attack Confederate defenses outside the city on May 19-22. If Vicksburg falls, the Mississippi River will be completely controlled by the United States. \\n \\n**May 22, 1863-** The US War Department issues General Order No. 143 establishes the United States Colored Troops. \\n \\n**June 9, 1863-** Battle of Brandy Station, Virginia. US cavalry forces cross the Rapidan River to attack General J.E.B. Stuart's cavalry and discover that Lee's men are moving west toward the Shenandoah Valley. The largest cavalry battle of the Civil War, it also marks the beginning of the Gettysburg Campaign. Meanwhile, the Federal assault on [Vicksburg, Mississippi](https:\/\/www.nps.gov\/vick)\\n has become a siege of the city where soldiers and civilians alike suffer from constant bombardment. \\n \\n**June 14-15, 1863-** Battle of Second Winchester, Virginia. Confederate troops under General Richard Ewell defeat Union troops under General Robert Milroy, clearing the Shenandoah Valley of Federal forces. \\n \\n**June 28, 1863-** [The Gettysburg Campaign](https:\/\/www.nps.gov\/gett)\\n continues. Confederates pass through York and reach the bridge over the Susquehanna River at Columbia, but Federal militia set fire to the bridge, denying access to the east shore. Confederate cavalry skirmishes with Federal militia near Harrisburg, Pennsylvania. \\n \\n**July 1-3-** [Battle of Gettysburg, Pennsylvania.](https:\/\/www.nps.gov\/gett)\\n The bloodiest battle of the Civil War dashes Robert E. Lee's hopes for a successful invasion of the North. \\n \\n**July 4-** [Vicksburg, Mississippi,](https:\/\/www.nps.gov\/vick)\\n surrenders to the US Army under Grant. The capture of Vicksburg gives the Unites States complete control of the Mississippi River, a vital supply line for the Confederate states in the west. At Gettysburg, Lee begins his retreat to Virginia. \\n \\n**July 10-11, 1863-** US naval and land forces attack Confederate defenses near Charleston, South Carolina. Among the United States troops is the 54th Massachusetts Colored Infantry, the first African American regiment of volunteers to see combat in the Civil War. \\n \\n**July 13, 1863-** Draft Riots begin in New York City and elsewhere as disgruntled workers and laborers, seething over the draft system that seemingly favors the rich, attack the draft office and African American churches. The riots continue through July 16. \\n \\n**July 13-14, 1863-** Near Falling Waters, Maryland, US troops skirmish with Lee's rearguard. That night the Army of Northern Virginia crosses the Potomac River and the Gettysburg Campaign ends. \\n \\n**July 18, 1863-** Second Assault on Battery Wagner, South Carolina. Leading the US infantry charge is the 54th Massachusetts Colored Infantry commanded by Colonel Robert Gould Shaw who is killed and buried with the dead of his regiment. \\n \\n**July 30, 1863-** Lincoln issues General Order 252 in response to the Confederate refusal to treat black soldiers the same as white soldiers. General Order 252 declares that for any US prisoner killed in violation of the laws of war, a Confederate prisoner would be killed in exchange. The prisoner exchange system effectually suspended. \\n \\n**August 21, 1863-** Sacking of Lawrence, Kansas. In a murderous daylight raid, Confederate and Missouri guerillas under William Clarke Quantrill storm into Lawrence and destroy most of the town. Approximately 150 men and boys are murdered by Quantrill's men. \\n \\n**September 9, 1863-** Chattanooga, Tennessee, is occupied by Federal forces under General William Rosecrans whose Army of the Cumberland will soon invade northern Georgia. \\n \\n**September 19-20, 1863-** [The Battle of Chickamauga,](https:\/\/www.nps.gov\/chch)\\n Georgia. The US Army of the Cumberland under General William Rosecrans is defeated and nearly routed by the Confederate Army of Tennessee commanded by General Braxton Bragg. Rosecrans' army retreats to the supply base at Chattanooga, Tennessee. \\n \\n**September-November 1863-** [The Siege of Chattanooga, Tennessee](https:\/\/www.nps.gov\/chch)\\n. Confederate forces under Braxton Bragg surround the occupied city. General Ulysses S. Grant is assigned to command the troops there and begins immediate plans to relieve the besieged US Army. \\n \\n**October 5, 1863-** Outside of Charleston Harbor, the Confederate David, a partially submerged, steam powered vessel, attacked the New Ironsides, part of the US fleet blockading the harbor, with a torpedo. Both ships survived the attack, though the commander of the David and one of his crew were captured. \\n \\n**October 9 -22, 1863-** Bristoe Station Campaign. In a feint toward Washington, Lee's Army of the Northern Virginia marches into northern Virginia in an attempt to flank the Army of the Potomac, under General Meade. Lee successfully outmaneuvers Meade though fails to bring him to battle or catch him in the open. An engagement at Bristoe Station, Virginia, on October 14 gives the campaign its name. \\n \\n**November 19, 1863-** Dedication of the Soldiers' National Cemetery at Gettysburg. President Abraham Lincoln delivers the Gettysburg Address. \\n \\n**November 23-25, 1863-** [Battles for Chattanooga.](https:\/\/www.nps.gov\/chch)\\n US forces break the Confederate siege of the city in successive attacks. The most notable event is the storming of Lookout Mountain on November 24 and Battle of Missionary Ridge the following day. The decisive Federal victory sends the Confederate Army south into Georgia where General Bragg reorganizes his forces before resigning from command on November 30. \\n \\n**November 26-December 1, 1863**\\\\- The Mine Run Campaign. US General Meade's Army of the Potomac marches against Confederate General Lee's Army of Northern Virginia south of the Rapidan River, east of Orange Court House. Lee reacts and throws up a line of defenses along the banks of Mine Run Creek. After several days of probing the defenses, Meade withdraws north of the Rapidan and goes into winter quarters. \\n \\n**November 27 to December 3, 1863-** Siege of Knoxville, Tennessee. Confederate troops under General James Longstreet lay siege to the city of Knoxville held by Federal forces under General Ambrose Burnside. Longstreet finally attacks on November 30 but is repulsed with heavy losses. The arrival of US reinforcements forces him to withdraw to Greeneville, Tennessee, where his corps will spend the winter. \\n \\n**December 8, 1863-** Lincoln Issues his Proclamation of Amnesty and Reconstruction, which would pardon those who participated in the \\\"existing rebellion\\\" if they take an oath to the United States.\\n\\n ![Historical black and white photograph of US General Ulysses S. Grant, standing, with his military staff, all seated in front of a tent.](https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/Grant-and-Staff_2.jpg?maxwidth=1300&autorotate=false%20%22Grant%20and%20Staff%20at%20Cold%20Harbor%22)\\n\\nWith the pressure of an election looming, in March of 1864, Lincoln appointed General Ulysses S. Grant to be commander of all the US armies. The war was far from decided and the fate of the Union was still uncertain.\\n\\nLibrary of Congress\\n\\n1864\\n----\\n\\n**February 9, 1864-** Escape from Libby Prison, Richmond. After weeks of digging, 109 United States officers made their escape from the notorious Libby Prison, the largest and most sensational escape of the war. Though 48 of the escapees were later captured and two drowned, 59 were able to make their way into US lines. \\n \\n**February 27, 1864-** In Georgia, Camp Sumter Prison Camp opens. Universally referred to as [Andersonville Prison Camp](https:\/\/www.nps.gov\/ande)\\n, it will become notorious for overcrowded conditions and a high death rate among its inmates. \\n \\n**February 14-20, 1864-** Federal capture and occupation of Meridian, Mississippi. Federal forces under William T. Sherman enter the city of Meridian, Mississippi after a successful month of campaigning through the central part of the state. The capture of this important Southern town, well known for its industry and storage capabilities, severely hampers the efforts of Confederate commanders to sustain their armies in the Deep South, Georgia and west of the Mississippi River. \\n \\n**February 17, 1864-** First successful submarine attack of the Civil War. The CSS H.L. Hunley, a seven-man submergible craft, attacked the USS Housatonic outside of Charleston, South Carolina. Struck by the submarine's torpedo, the Housatonic broke apart and sank, taking all but five of her crew with her. Likewise, the Hunley was also lost and never heard from again until discovered in 1995 at the spot where it sank after the attack. \\n \\n**March 2, 1864-** US General Ulysses S. Grant is appointed lieutenant general, a rank revived at the request of President Lincoln. Grant assumes command of all United States Armies in the field the following day. \\n \\n**March 10, 1864-** The Red River Campaign begins. As part of an overall Federal strategy to strike deep into various parts of the Confederacy, a combined force of army and navy commands under General Nathaniel Banks begins a campaign on the Red River in Louisiana. \\n \\n**April 8, 1864-** Battle of Sabine Crossroads or Mansfield, Louisiana, the first major battle of the Red River Campaign in Louisiana. \\n \\n**April 9, 1864-** Battle of Pleasant Hill, Louisiana. The United States Army under Banks defeats the attempt by Confederate forces under General Richard Taylor to drive them out of Louisiana. The result of the campaign would be less than desired as it drew to a close in the first week of May with Confederates still in control of most of the state. \\n \\n**April 12, 1864-** Capture of Fort Pillow, Tennessee. After a rapid raid through central and western Tennessee, Confederate cavalry under Nathan Bedford Forrest attacked and overwhelmed the Federal garrison at Fort Pillow, located on the Mississippi River. Forrest's troops murdered nearly 300 United States soldiers after they had surrendered, most of whom were African American. Congress investigated the affair and while Confederate authorities denied any wrongdoing, the events at Fort Pillow cast a pall over Forrest's reputation and remained an emotional issue throughout the remainder of the war and after. \\n \\n**April 17, 1864-** Grant forbids prisoner exchange talks to progress unless Confederate authorities agree to treat black soldiers the same as white and until Confederates release enough US soldiers to make up for the large number of Confederates paroled at Vicksburg and Port Hudson. \\n \\n**May 5-6, 1864-** [Battle of the Wilderness, Virginia](https:\/\/www.nps.gov\/frsp)\\n, the opening battle of the Overland Campaign. US General Ulysses S. Grant, accompanying the Army of the Potomac under General Meade, issued orders for the campaign to begin on May 3. Lee responded by attacking the Federal column in the dense woods and underbrush of an area known as the Wilderness, west of Fredericksburg, Virginia. \\n \\n**May 7, 1864-** Beginning of the Atlanta Campaign. With three US Armies under his command, General William T. Sherman marched south from Tennessee into Georgia against the Confederate Army of Tennessee under General Joseph Johnston, the objective being the city of Atlanta. \\n \\n**May 8-21, 1864-** [Battle of Spotsylvania Court House, Virginia](https:\/\/www.nps.gov\/frsp)\\n. Lee successfully stalls Grant's drive toward Richmond. \\n \\n**May 11, 1864-** Battle of Yellow Tavern. Six miles north of Richmond, Confederate cavalry under General J.E.B. Stuart block Federal cavalry under General Philip Sheridan. General Stuart was mortally wounded during the encounter. \\n \\n**May 14-15, 1864-** Battle of Resaca, Georgia. General Sherman's armies are blocked at Resaca by General Johnston's Army of Tennessee. After two days of maneuvering and intense fighting, Johnston withdraws. Sherman will advance but take precautions against ordering any further massed assaults where high casualties may occur. \\n \\n**June 1-3, 1864-** [Battle of Cold Harbor, Virginia](https:\/\/www.nps.gov\/rich)\\n. Relentless and bloody US attacks fail to dislodge Lee's army from its strong line of defensive works northeast of Richmond. \\n \\n**June 8, 1864-** Abraham Lincoln is nominated for a second term as president. \\n \\n**June 10, 1864-** [Battle of Brice's Crossroads, Mississippi](https:\/\/www.nps.gov\/brcr)\\n\\\\- In spite of being outnumbered almost two to one, Confederate General Nathan Bedford Forrest attacks and routs the Federal command under General Samuel Sturgis. \\n \\n**June 15-18, 1864-** [Assault on Petersburg, Virginia](https:\/\/www.nps.gov\/pete)\\n. After withdrawing from the lines at Cold Harbor, the Army of the Potomac crossed the James River and with troops from the Army of the James attacked the outer defenses of Petersburg, the primary junction for several southern railroads. After four days of bloody attacks, Grant accepts that only a siege can systematically isolate the city and cut off Confederate supplies to the capital of Richmond. \\n \\n**June 19, 1864-** The USS Kearsarge sinks the Confederate raider CSS Alabama near Cherbourg, France. \\n \\n**June 27, 1864-** [Battle of Kennesaw Mountain, Georgia](https:\/\/www.nps.gov\/kemo)\\n. After weeks of maneuvering and battles, Sherman's Army of the Cumberland and Army of the Tennessee smash headlong into Johnston's carefully planned defenses at Big and Little Kennesaw. Johnston remains on this line until July 2, when he retreats at the threat being flanked by Sherman's mobile force. \\n \\n**July 9, 1864-** [Battle of Monocacy, Maryland](https:\/\/www.nps.gov\/mono)\\n. In an attempt to draw Federal troops away from the ongoing siege of Petersburg and Richmond, a Confederate force under Jubal Early quietly moved north into Maryland. Early had made excellent progress until he reached Frederick, Maryland, where a force of 6,000 Federal troops under General Lew Wallace, was arrayed to delay his advance. Though the battle was a US defeat, it was also touted as \\\"the battle that saved Washington\\\" for it succeeded in holding back Early's march until troops could be sent to the capital's defense. \\n \\n**July 11-12, 1864-** Attack on the Defenses of Washington. Jubal Early's troops arrive on the outskirts of Washington, DC, and trade cannon fire with a token Federal force remaining in the forts around the city. President Lincoln observes the skirmishing from Fort Stevens as reinforcements from the Army of the Potomac arrive and quickly fill in the works. Early withdraws that evening. \\n \\n**July 14-15, 1864-** [Battles near Tupelo, Mississippi.](https:\/\/www.nps.gov\/tupe)\\n The US defeat of Nathan Bedford Forrest secured the supply lines to Sherman's armies operating against Atlanta, Georgia. \\n \\n**July 17, 1864-** General John Bell Hood replaces General Joseph Johnston as commander of the Army of Tennessee. This change in command signals a new Confederate strategy to thwart Sherman's campaign, though the end result will be disastrous for the Confederate cause. \\n \\n**July 20, 1864-** Battle of Peachtree Creek, Georgia, the first major battle around the city of Atlanta. General Hood sends his army out of the city's defenses to attack the approaching Federal troops under George Thomas. After several hours of fierce fighting, Hood withdrew back to his own defensive works. \\n \\n**July 21, 1864-** The Battle of Atlanta. Hood's second effort to throw back Federal forces under Sherman brings him heavy casualties with no positive results. General James McPherson, commander of the US Army of the Tennessee, is killed during the fighting. \\n \\n**July 30, 1864-** The [Battle of the Crater at Petersburg, Virginia](https:\/\/www.nps.gov\/pete)\\n. After a month of tunneling by soldiers of the 48th Pennsylvania Infantry, a Federal forces explode a massive mine under a Confederate fort in the Petersburg siege lines. The infantry charge that followed was poorly coordinated and by day's end, Confederate counterattacks had driven out the US troops and the siege lines remained unchanged. \\n \\n**August 5, 1864-** Battle of Mobile Bay. A US fleet under Admiral David Farragut steamed into Mobile Bay outside the city of Mobile, Alabama, defended by two strong forts and a small southern flotilla, including the formidable ironclad CSS Tennessee. Farragut's ships defeated the Confederate ships and bypassed the forts, capturing the important Southern port. \\n \\n**August 18-19, 1864-** Battles on the Weldon Railroad near Petersburg, Virginia. US attempts to capture this important railroad into Petersburg were stopped by Confederate counterattacks. Despite Confederate efforts, the US remained in firm possession of their gains and the railroad. \\n \\n**August 25, 1864-** Battle of Ream's Station, near Petersburg, Virginia. A surprise Confederate counterattack briefly stopped Federal destruction of the Weldon Railroad near Ream's Station, though failed to release the Federal grip on this important supply line into Petersburg. \\n \\n**August 31- September 1, 1864-** Battle of Jonesborough, Georgia. The final Confederate counterattack against United States troops outside the city of Atlanta fails. \\n \\n**September 1, 1864-** Fall of Atlanta, Georgia. Confederate troops under General Hood evacuate the city of Atlanta. General Sherman's army occupies the city and its defenses the following day. \\n \\n**September 19, 1864-** Third Battle of Winchester, Virginia. US forces under General Philip Sheridan attacked the Confederate army under Jubal Early near the city of Winchester and drove them southward, up the Shenandoah Valley. \\n \\n**September 22, 1864-** Battle of Fisher's Hill, Virginia. The US Army of the Shenandoah under General Philip Sheridan attacked Jubal Early's Confederates near Fisher's Hill, overpowering the Confederates and again forcing them to flee the battlefield. United States officers and officials in Washington believe this to be the final battle in the Shenandoah Valley. \\n \\n**September 29-30, 1864-** Battle of Fort Harrison near Richmond, Virginia. In a sweeping assault, the Confederate stronghold known as Fort Harrison falls to the Army of the James. Confederate efforts to retake the fort fail. \\n \\n**October 19, 1864-** [The Battle of Cedar Creek, Virginia](https:\/\/www.nps.gov\/cebe)\\n. In an early morning surprise attack, Jubal Early's Confederates successfully attack and drive troops of the Army of the Shenandoah from their camps on the banks of Cedar Creek south of Middletown, Virginia. Hearing the fight from his headquarters at Winchester, General Philip Sheridan rides southward, rallying dispirited troops who return to the battlefield. By day's end, Early's forces are put to flight. Despite several attempts to disrupt the US advance in the coming weeks, the struggle for control of the Shenandoah Valley is over. \\n \\n**November 8, 1864-** Abraham Lincoln is reelected president of the United States. \\n \\n**November 16, 1864-** General Sherman's Army of Georgia begins the March to the Sea. \\n \\n**November 30, 1864-** Battle of Franklin, Tennessee. After a month of raiding Sherman's supply lines and attacking Federal outposts, John Bell Hood's army confronts US troops from General John Schofield's command, who they had encountered the day before near Spring Hill, Tennessee. A massive frontal assault on the well entrenched Federal line meets with disaster. Despite some taking of outside works and defenses, the toll for Hood's forces is too heavy including the loss of six of his generals. US troops retreat in the direction of Nashville. \\n \\n**December 10, 1864-** Harassed only by scattered Georgia militia, Sherman's Army of Georgia arrives at Savannah, Georgia, completing the famous March to the Sea. At Savannah, his troops will take Fort McAllister and force Confederate defenders to evacuate the city. \\n \\n**December 15-16, 1864-** The Battle of Nashville, Tennessee. The Confederate Army under John Bell Hood is thoroughly defeated and the threat to Tennessee ends.\\n\\n ![Colored illustration of orderly lines of United States soldiers, on foot and on horseback passing a crown with American flags lining the walkways.](https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/Grand-review.jpg?maxwidth=1300&autorotate=false%20%22The%20Grand%20Review%20at%20Washington%20May%2023,%201865.%20The%20Glorious%20Army%20of%20the%20Potomac%20Passing%20the%20Head%20Stand%22)\\n\\nThe Grand Review in May 1865 celebrated the United States victory on the Civil War and the reunification of the nation. The future of the new United States, especially in the wake of the assassination of President Abraham Lincoln, was anything but clear.\\n\\nLibrary of Congress\\n\\n1865\\n----\\n\\n**January 15, 1865-** Assault and capture of Fort Fisher, North Carolina. United States occupation of this fort at the mouth of the Cape Fear River closes access to Wilmington, the last Southern seaport on the east coast that was open to blockade runners and commercial shipping. \\n \\n**February 1, 1865-** Sherman's Army leaves Savannah to march through the Carolinas. \\n \\n**February 17, 1865-** Sherman's Army captures Columbia, South Carolina while Confederate defenders evacuate Charleston, South Carolina. \\n \\n**February 22, 1865-** Wilmington, NC, falls to Federal troops, closing the last important Southern port on the east coast. On this same day, Joseph E. Johnston is restored to command the nearly shattered Army of the Tennessee, vice John B. Hood who resigned a month earlier. \\n \\n**March 4, 1865-** President Abraham Lincoln is inaugurated for his second term as president in Washington, DC. \\n \\n**March 11, 1865-** Sherman's Army occupies Fayetteville, North Carolina. \\n \\n**March 16 and 19-21, 1865-** The Battles of Averasborough and Bentonville, North Carolina. Sherman's army is stalled in its drive northward from Fayetteville but succeeds in passing around the Confederate forces toward its object of Raleigh. \\n \\n**March 25, 1865-** [Attack on Fort Stedman, Petersburg,](https:\/\/www.nps.gov\/pete)\\n Virginia. Touted as \\\"Lee's last offensive,\\\" Confederate troops under General John B. Gordon attack and briefly capture the Federal fort in the Petersburg siege lines in an attempt to thwart US plans for a late March assault. By day's end, the Confederates will be thrown out and the lines remain unchanged. \\n \\n**April 1, 1865-** [The Battle of Five Forks, Virginia](https:\/\/www.nps.gov\/pete)\\n. The Confederate defeat at Five Forks initiates General Lee's decision to abandon the Petersburg-Richmond siege lines. \\n \\n**April 2, 1865-** The Fall of Petersburg and [Richmond](https:\/\/www.nps.gov\/rich)\\n. General Lee abandons both cities and moves his army west in hopes of joining Confederate forces under General Johnston in North Carolina. \\n \\n**April 3, 1865-** US troops occupy Richmond and Petersburg, Virginia. \\n \\n**April 6, 1865-** The Battle of Sailor's Creek, Virginia. A portion of Lee's Army, almost one-third of it, is cornered along the banks of Sailor's (or \\\"Saylor's\\\") Creek and annihilated. \\n \\n**April 9, 1865-** [Battle of Appomattox Court House and Surrender, Appomattox Court House, Virginia.](https:\/\/www.nps.gov\/apco)\\n After an early morning attempt to break through Federal forces blocking the route west to Danville, Virginia, Lee seeks an audience with General Grant to discuss terms. That afternoon in the parlor of Wilmer McLean, Lee signs the document of surrender. On April 12, the Army of Northern Virginia formally surrenders and is disbanded. \\n \\n**April 14, 1865-** President Abraham Lincoln is assassinated by actor John Wilkes Booth at [Ford's Theater](https:\/\/www.nps.gov\/foth)\\n in Washington, DC. On the same day, Fort Sumter, South Carolina is re-occupied by US troops. \\n \\n**April 15, 1865-** Vice President Andrew Johnson is sworn in as 17th President of the United States. \\n \\n**April 26, 1865-** General Joseph Johnston signs the surrender document for the Confederate Army of the Tennessee and miscellaneous Confederate troops attached to his command at Bennett's Place near Durham, North Carolina. \\n \\n**May 4, 1865-** General Richard Taylor surrenders Confederate forces in the Department of Alabama, Mississippi and East Louisiana. \\n \\n**May 10, 1865-** Confederate President Jefferson Davis is captured near Irwinville, Georgia. \\n \\n**May 12, 1865-** The final battle of the Civil War takes place at Palmito Ranch, Texas. It is a Confederate victory. \\n \\n**May 23, 1865-** The Grand Review of the Army of the Potomac in Washington, DC. \\n \\n**May 24, 1865-** The Grand Review of General Sherman's Army in Washington, DC. \\n \\n**May 26, 1865-** General Simon Bolivar Buckner agrees to terms of surrender of the Army of the Trans-Mississippi, which are agreed to on June 2, 1865. With this surrender of the last large Confederate army, the Civil War officially ends. (Confederate Brigadier General Stand Waite did not surrender until June 23, and one Confederate ship, the CSS Shenandoah, docked in Liverpool and surrendered to the Royal Navy on November 6, 1865.)\\n\\nLast updated: October 6, 2022\\n\\n### Success\\n\\nThank you. Your feedback has been received.\\n\\n### Error\\n\\nalert message\\n\\nWas this page helpful?\\n----------------------\\n\\n Yes\\n\\n No\\n\\nHow could we improve this page? 500 characters allowed\\n\\nSubmit\\n\\nPark footer\\n-----------\\n\\n### Contact Info\\n\\n#### Mailing Address:\\n\\n1195 Baltimore Pike \\nGettysburg, PA 17325\\n\\n#### [Contact Us](\/gett\/contacts.htm)\\n\\n### Tools\\n\\n* [Site Index](\/gett\/siteindex.htm)\\n \\n* [Espa\u00f1ol](\/gett\/espanol\/index.htm)\\n \\n\\n### Stay Connected\\n\\n* [Facebook](http:\/\/www.facebook.com\/GettysburgNPS)\\n \\n* [Twitter](http:\/\/twitter.com\/gettysburgnmp)\\n \\n* [Instagram](http:\/\/www.instagram.com\/gettysburgnps)\\n \\n* [YouTube](http:\/\/www.youtube.com\/GettysburgNPS)\\n \\n\\n \\n\\npreviousnextstart slideshow\",\"metadata\":{\"title\":\"Civil War Timeline - Gettysburg National Military Park (U.S. National Park Service)\",\"description\":\"A time line of the American Civil War\",\"language\":\"en\",\"ogTitle\":\"Civil War Timeline - Gettysburg National Military Park (U.S. National Park Service)\",\"ogDescription\":\"A time line of the American Civil War\",\"ogUrl\":\"https:\/\/www.nps.gov\/gett\/learn\/historyculture\/civil-war-timeline.htm\",\"ogImage\":\"https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/1860-Election-Cartoon.jpg\",\"ogLocaleAlternate\":[],\"viewport\":\"width=device-width, initial-scale=1.0\",\"apple-itunes-app\":\"app-id=1549226484, app-argument=https:\/\/apps.apple.com\/us\/app\/national-park-service\/id1549226484\",\"og:type\":\"website\",\"og:title\":\"Civil War Timeline - Gettysburg National Military Park (U.S. National Park Service)\",\"og:url\":\"https:\/\/www.nps.gov\/gett\/learn\/historyculture\/civil-war-timeline.htm\",\"og:description\":\"A time line of the American Civil War\",\"og:image\":[\"https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/1860-Election-Cartoon.jpg\",\"https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/Ft-Sumter_1.jpg\",\"https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/Enslaved-People-Fording-Rappahanock.jpg\",\"https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/Gettysburg-Dead.jpg\",\"https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/Grant-and-Staff_2.jpg\",\"https:\/\/www.nps.gov\/gett\/learn\/historyculture\/images\/Grand-review.jpg\"],\"og:image:height\":[\"2000\",\"2500\",\"2211\",\"2026\",\"2500\",\"2500\"],\"og:image:width\":[\"2928\",\"3814\",\"3384\",\"3300\",\"3846\",\"3849\"],\"og:image:alt\":[\"Greyscale political cartoon from 1860 showing four men tearing apart a map of the United States.\",\"Color illustration of cannons flying in arcs over the ocean to a stone fort.\",\"Historical black and white photograph of a group of Black people, including men on horses and a woman on a wagon pulled by oxen crossing a low river while watched by white US soldier.\",\"Historical black and white photograph of flat, open field with scattered dead bodies.\",\"Historical black and white photograph of US General Ulysses S. Grant, standing, with his military staff, all seated in front of a tent.\",\"Colored illustration of orderly lines of United States soldiers, on foot and on horseback passing a crown with American flags lining the walkways.\"],\"sourceURL\":\"https:\/\/www.nps.gov\/gett\/learn\/historyculture\/civil-war-timeline.htm\",\"statusCode\":200}}}" -} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainFirecrawlTool-a08c0ae23dd3be2864787728bf4e74c4.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainFirecrawlTool-a08c0ae23dd3be2864787728bf4e74c4.json deleted file mode 100644 index 6285b6a..0000000 --- a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainFirecrawlTool-a08c0ae23dd3be2864787728bf4e74c4.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "X-Powered-By": "Express", - "Access-Control-Allow-Origin": "*" - }, - "data": "{\"success\":true,\"data\":{\"markdown\":\"Your Profile\\n\\n[![](https:\/\/www.history.com\/assets\/images\/history\/logo.svg)History](\/)\\n\\n* [Find History on Facebook (Opens in a new window)](https:\/\/www.facebook.com\/History)\\n \\n* [Find History on Twitter (Opens in a new window)](https:\/\/twitter.com\/history)\\n \\n* [Find History on YouTube (Opens in a new window)](https:\/\/www.youtube.com\/subscription_center?add_user=historychannel)\\n \\n* [Find History on Instagram (Opens in a new window)](http:\/\/instagram.com\/history)\\n \\n* [Find History on TikTok (Opens in a new window)](https:\/\/www.tiktok.com\/@history)\\n \\n\\n[Email Updates](\/emails\/sign-up)\\n\\n* [Live TV](https:\/\/play.history.com\/live)\\n \\n* [History Classics](https:\/\/play.history.com\/channel\/ancient-aliens-fan-favorites)\\n \\n* [Shows](https:\/\/www.history.com\/shows)\\n \\n* [This Day In History](https:\/\/www.history.com\/this-day-in-history)\\n \\n* [Schedule](https:\/\/www.history.com\/schedule)\\n \\n* [Topics](https:\/\/www.history.com\/topics)\\n \\n* [Stories](https:\/\/www.history.com\/news)\\n \\n* [Videos](https:\/\/www.history.com\/videos)\\n \\n* [History Podcasts](https:\/\/www.history.com\/podcasts)\\n \\n* [History Vault](https:\/\/www.historyvault.com\/?cmpid=HV_O_Site_H_Menu)\\n \\n\\n![](https:\/\/www.history.com\/editorial\/_next\/image?url=https%3A%2F%2Fassets.editorial.aetnd.com%2Fuploads%2F2012%2F05%2Fthis-day-in-history-11-19-1863-lincoln-gettysburg-address.jpg&w=3840&q=75)\\n\\n[1863](\/this-day-in-history\/year\/1863)\\n\\nPresident Lincoln delivers Gettysburg Address\\n=============================================\\n\\nThis Day In History: 11\/19\/1863 - Lincoln Gettysburg Address\\n\\nPlay Video\\n\\nLearn more\\n\\nRelated contentRelated contentShare VideoShare Video\\n\\nPlaying on\\n\\nSubtitles\\n\\nLanguage\\n\\nSettings\\n\\n* QualityAutomatic Automatic HD\\n* SpeedNormal\\n* SubtitleOptions\\n\\nQuality\\n\\n* Automatic\\n\\nSpeed\\n\\n* 0.25\\n* 0.5\\n* Normal\\n* 1.25\\n* 1.5\\n* 2\\n\\nSubtitle Options\\n\\n* Font familyDefault\\n* Font colorDefault\\n* Font opacityDefault\\n* Font sizeDefault\\n* Background colorDefault\\n* Background opacityDefault\\n* Window colorDefault\\n* Window opacityDefault\\n* Character edge styleDefault\\n\\nFont family\\n\\n* Default\\n* Monospaced Serif\\n* Proportional Serif\\n* Monospaced Sans-Serif\\n* Proportional Sans-Serif\\n\\nFont color\\n\\n* Default\\n* White\\n* Yellow\\n* Green\\n* Cyan\\n* Blue\\n* Magenta\\n* Red\\n* Black\\n\\nFont opacity\\n\\n* Default\\n* 25%\\n* 50%\\n* 75%\\n* 100%\\n\\nFont size\\n\\n* Default\\n* 50%\\n* 75%\\n* 100%\\n* 150%\\n* 200%\\n\\nBackground color\\n\\n* Default\\n* White\\n* Yellow\\n* Green\\n* Cyan\\n* Blue\\n* Magenta\\n* Red\\n* Black\\n\\nBackground opacity\\n\\n* Default\\n* 0%\\n* 25%\\n* 50%\\n* 75%\\n* 100%\\n\\nWindow color\\n\\n* Default\\n* White\\n* Yellow\\n* Green\\n* Cyan\\n* Blue\\n* Magenta\\n* Red\\n* Black\\n\\nWindow opacity\\n\\n* Default\\n* 0%\\n* 25%\\n* 50%\\n* 75%\\n* 100%\\n\\nCharacter edge style\\n\\n* Default\\n* None\\n* Drop Shadow\\n* Raised\\n* Depressed\\n* Uniform\\n\\nLoaded: 0%\\n\\n0:00\\n\\nProgress: 0%\\n\\n0:00\\n\\nProgress: 0%\\n\\nPlayPlayUnmuteUnmute\\n\\nCurrent Time 0:00\\n\\n\/\\n\\nDuration Time 0:00\\n\\nLive\\n\\nRemaining Time -0:00\\n\\nWatch in VRWatch in VR\\n\\n* , selecteddescriptions off\\n\\nDescriptions\\n\\nSubtitlesSubtitlesUnavailable\\n\\nUnavailableUnavailable\\n\\nUnavailableLanguageLanguageSettingsHDSettingsFullscreenFullscreen\\n\\nThis is a modal window.\\n\\nCaption Settings Dialog\\n\\nBeginning of dialog window. Escape will cancel and close the window.\\n\\nTextColorWhiteBlackRedGreenBlueYellowMagentaCyanTransparencyOpaqueSemi-Transparent\\n\\nBackgroundColorBlackWhiteRedGreenBlueYellowMagentaCyanTransparencyOpaqueSemi-TransparentTransparent\\n\\nWindowColorBlackWhiteRedGreenBlueYellowMagentaCyanTransparencyTransparentSemi-TransparentOpaque\\n\\nFont Size50%75%100%125%150%175%200%300%400%\\n\\nText Edge StyleNoneRaisedDepressedUniformDropshadow\\n\\nFont FamilyProportional Sans-SerifMonospace Sans-SerifProportional SerifMonospace SerifCasualScriptSmall Caps\\n\\nDefaultsDone\\n\\n* [Powered by THEOplayer 7.5.0](https:\/\/www.theoplayer.com\/player-referral)\\n \\n\\nClose Related Content\\n\\nClose Share\\n\\nOn November 19, 1863, at the dedication of a military cemetery at Gettysburg, [Pennsylvania](\/topics\/us-states\/pennsylvania)\\n, during the [American](\/topics\/american-civil-war)\\n [Civil War](\/topics\/american-civil-war\/american-civil-war-history)\\n, President [Abraham Lincoln](\/topics\/us-presidents\/abraham-lincoln)\\n delivers one of the most memorable speeches in American history. In fewer than 275 words, Lincoln brilliantly and movingly reminded a war-weary public why the Union had to fight, and win, the Civil War.\\n\\nThe [Battle of Gettysburg](\/topics\/american-civil-war\/battle-of-gettysburg)\\n, fought some four months earlier, was one of the single bloodiest battle of the Civil War. Over the course of three days, more than 45,000 men were killed, injured, captured or went missing. The battle also proved to be the turning point of the war: General Robert E. Lee\u2019s defeat and retreat from Gettysburg marked the last Confederate invasion of Northern territory and the beginning of the Southern army\u2019s ultimate decline.\\n\\nPlay Video\\n\\nLearn more\\n\\nRelated contentRelated contentShare VideoShare Video\\n\\nPlaying on\\n\\nSubtitles\\n\\nLanguage\\n\\nSettings\\n\\n* QualityAutomatic Automatic HD\\n* SpeedNormal\\n* SubtitleOptions\\n\\nQuality\\n\\n* Automatic\\n\\nSpeed\\n\\n* 0.25\\n* 0.5\\n* Normal\\n* 1.25\\n* 1.5\\n* 2\\n\\nSubtitle Options\\n\\n* Font familyDefault\\n* Font colorDefault\\n* Font opacityDefault\\n* Font sizeDefault\\n* Background colorDefault\\n* Background opacityDefault\\n* Window colorDefault\\n* Window opacityDefault\\n* Character edge styleDefault\\n\\nFont family\\n\\n* Default\\n* Monospaced Serif\\n* Proportional Serif\\n* Monospaced Sans-Serif\\n* Proportional Sans-Serif\\n\\nFont color\\n\\n* Default\\n* White\\n* Yellow\\n* Green\\n* Cyan\\n* Blue\\n* Magenta\\n* Red\\n* Black\\n\\nFont opacity\\n\\n* Default\\n* 25%\\n* 50%\\n* 75%\\n* 100%\\n\\nFont size\\n\\n* Default\\n* 50%\\n* 75%\\n* 100%\\n* 150%\\n* 200%\\n\\nBackground color\\n\\n* Default\\n* White\\n* Yellow\\n* Green\\n* Cyan\\n* Blue\\n* Magenta\\n* Red\\n* Black\\n\\nBackground opacity\\n\\n* Default\\n* 0%\\n* 25%\\n* 50%\\n* 75%\\n* 100%\\n\\nWindow color\\n\\n* Default\\n* White\\n* Yellow\\n* Green\\n* Cyan\\n* Blue\\n* Magenta\\n* Red\\n* Black\\n\\nWindow opacity\\n\\n* Default\\n* 0%\\n* 25%\\n* 50%\\n* 75%\\n* 100%\\n\\nCharacter edge style\\n\\n* Default\\n* None\\n* Drop Shadow\\n* Raised\\n* Depressed\\n* Uniform\\n\\nLoaded: 0%\\n\\n0:00\\n\\nProgress: 0%\\n\\n0:00\\n\\nProgress: 0%\\n\\nPausePauseUnmuteUnmute\\n\\nCurrent Time 0:00\\n\\n\/\\n\\nDuration Time 0:00\\n\\nLive\\n\\nRemaining Time -0:00\\n\\nWatch in VRWatch in VR\\n\\n* , selecteddescriptions off\\n\\nDescriptions\\n\\nSubtitlesSubtitlesUnavailable\\n\\nUnavailableUnavailable\\n\\nUnavailableLanguageLanguageSettingsHDSettingsFullscreenFullscreen\\n\\nThis is a modal window.\\n\\nCaption Settings Dialog\\n\\nBeginning of dialog window. Escape will cancel and close the window.\\n\\nTextColorWhiteBlackRedGreenBlueYellowMagentaCyanTransparencyOpaqueSemi-Transparent\\n\\nBackgroundColorBlackWhiteRedGreenBlueYellowMagentaCyanTransparencyOpaqueSemi-TransparentTransparent\\n\\nWindowColorBlackWhiteRedGreenBlueYellowMagentaCyanTransparencyTransparentSemi-TransparentOpaque\\n\\nFont Size50%75%100%125%150%175%200%300%400%\\n\\nText Edge StyleNoneRaisedDepressedUniformDropshadow\\n\\nFont FamilyProportional Sans-SerifMonospace Sans-SerifProportional SerifMonospace SerifCasualScriptSmall Caps\\n\\nDefaultsDone\\n\\n* [Powered by THEOplayer 7.5.0](https:\/\/www.theoplayer.com\/player-referral)\\n \\n\\nThe Gettysburg Address\\n\\nClose Related Content\\n\\nClose Share\\n\\nCharged by Pennsylvania\u2019s governor, Andrew Curtin, to care for the Gettysburg dead, an attorney named David Wills bought 17 acres of pasture to turn into a cemetery for the more than 7,500 who fell in battle. Wills invited Edward Everett, one of the most famous orators of the day, to deliver a speech at the cemetery\u2019s dedication. Almost as an afterthought, Wills also sent a letter to Lincoln\u2014just two weeks before the ceremony\u2014requesting \u201ca few appropriate remarks\u201d to consecrate the grounds.\\n\\nAt the dedication, the crowd listened for two hours to Everett before Lincoln spoke. Lincoln\u2019s address lasted just two or three minutes. The speech reflected his redefined belief that the Civil War was not just a fight to save the Union, but a struggle for freedom and equality for all, an idea Lincoln had not championed in the years leading up to the war.\\n\\nThis was his stirring conclusion: \u201cThe world will little note, nor long remember what we say here, but it can never forget what they did here. It is for us the living, rather, to be dedicated here to the unfinished work which they who fought here have thus far so nobly advanced. It is rather for us to be here dedicated to the great task remaining before us\u2014that from these honored dead we take increased devotion to that cause for which they gave the last full measure of devotion\u2014that we here highly resolve that these dead shall not have died in vain\u2014that this nation, under God, shall have a new birth of freedom\u2014and that government of the people, by the people, for the people, shall not perish from the earth.\u201d\\n\\nReception of Lincoln\u2019s Gettysburg Address was initially mixed, divided strictly along partisan lines. Nevertheless, the \u201clittle speech,\u201d as he later called it, is thought by many today to be the most eloquent articulation of the democratic vision ever written.\\n\\n[![Battle of Gettysburg](https:\/\/assets.editorial.aetnd.com\/uploads\/2019\/07\/battle-of-gettysburg-gettyimages-3090040-copy.jpg?width=3840&quality=75&auto=webp)](\/news\/battle-gettysburg-turning-point-civil-war)\\n\\n[How the Battle of Gettysburg Turned the Tide of the Civil War\\\\\\n-------------------------------------------------------------\\\\\\n\\\\\\nIn a must-win clash, Union forces halted the northern invasion of Robert E. Lee\u2019s Confederate Army.\\\\\\n\\\\\\nRead more](\/news\/battle-gettysburg-turning-point-civil-war)\\n\\n[![The Lincoln Memorial in Washington, D.C.](https:\/\/assets.editorial.aetnd.com\/uploads\/2013\/03\/gettyimages-486565700.jpg?width=3840&quality=75&auto=webp)](\/news\/gettysburg-address-facts)\\n\\n[8 Surprising Facts About the Gettysburg Address\\\\\\n-----------------------------------------------\\\\\\n\\\\\\nAbraham Lincoln\u2019s Civil War-era speech is one for the ages.\\\\\\n\\\\\\nRead more](\/news\/gettysburg-address-facts)\\n\\n[![Abraham Lincoln making his famous address.Abraham Lincoln making his famous address on 19 November 1863 at the dedication of the Soldiers' National Cemetery at Gettysburg on the site of the American Civil War battle with the greatest number of casualties. Lithograph. (Photo by: Photo12\/Universal Images Group via Getty Images)](https:\/\/www.history.com\/this-day-in-history\/Photo%20by:%20Photo12\/Universal%20Images%20Group%20via%20Getty%20Images)](\/news\/abraham-lincoln-famous-quotes-speeches)\\n\\n[Abraham Lincoln\u2019s Most Enduring Speeches and Quotes\\\\\\n---------------------------------------------------\\\\\\n\\\\\\nFrom soaring oratory like the Gettysburg Address to folksy, humorous yarns, Lincoln knew how to wield the power of words.\\\\\\n\\\\\\nRead more](\/news\/abraham-lincoln-famous-quotes-speeches)\\n\\nAlso on This Day in History November | 19\\n-----------------------------------------\\n\\n* * *\\n\\n![](https:\/\/www.history.com\/editorial\/_next\/image?url=https%3A%2F%2Fassets.editorial.aetnd.com%2Fhistory-article-default.desktop.jpg&w=3840&q=75)[2004](\/this-day-in-history\/year\/2004)\\n\\n### [NBA players and fans brawl at infamous \\\"Malice at the Palace\\\" game](\/this-day-in-history\/sports-brawls-nba-infamous)\\n\\n[Sports](\/topics\/sports)\\n\\n![](https:\/\/www.history.com\/editorial\/_next\/image?url=https%3A%2F%2Fassets.editorial.aetnd.com%2Fuploads%2F2012%2F05%2Fthis-day-in-history-11-19-1863-lincoln-gettysburg-address.jpg&w=3840&q=75)\\n\\n### [This Day in History Video: What Happened on November 19](\/this-day-in-history\/november-19-video)\\n\\n[U.S. Presidents](\/topics\/us-presidents)\\n\\n![](https:\/\/www.history.com\/editorial\/_next\/image?url=https%3A%2F%2Fassets.editorial.aetnd.com%2Fhistory-article-default.desktop.jpg&w=3840&q=75)[1942](\/this-day-in-history\/year\/1942)\\n\\n### [Soviets launch counterattack at Stalingrad](\/this-day-in-history\/soviet-counterattack-at-stalingrad)\\n\\n[World War II](\/topics\/world-war-ii)\\n\\n![](https:\/\/assets.editorial.aetnd.com\/uploads\/2024\/10\/GettyImages-594896582.jpg?width=3840&quality=75&auto=webp)\\n\\n### Wake Up to This Day in History\\n\\nSign up now to learn about This Day in History straight from your inbox. \\nGet all of today's events in just one email featuring a range of topics.\\n\\nSign Up\\n\\nBy submitting your information, you agree to receive emails from HISTORY and A+E Networks. You can opt out at any time. You must be 16 years or older and a resident of the United States.\\n\\n**More details**: [Privacy Notice](https:\/\/www.aenetworks.com\/privacy)\\n | [Terms of Use](https:\/\/www.aenetworks.com\/terms)\\n | [Contact Us](https:\/\/support.history.com\/)\\n\\n![](https:\/\/www.history.com\/editorial\/_next\/image?url=https%3A%2F%2Fassets.editorial.aetnd.com%2Fhistory-article-default.desktop.jpg&w=3840&q=75)[1969](\/this-day-in-history\/year\/1969)\\n\\n### [Soccer legend Pel\u00e9 scores 1,000th goal](\/this-day-in-history\/pele-scores-1000th-goal)\\n\\n[Sports](\/topics\/sports)\\n\\n![](https:\/\/www.history.com\/editorial\/_next\/image?url=https%3A%2F%2Fassets.editorial.aetnd.com%2Fhistory-article-default.desktop.jpg&w=3840&q=75)[2003](\/this-day-in-history\/year\/2003)\\n\\n### [An arrest warrant is issued for Michael Jackson](\/this-day-in-history\/an-arrest-warrant-is-issued-for-michael-jackson)\\n\\n[Art, Literature and Film History](\/topics\/art-history)\\n\\n![](https:\/\/www.history.com\/editorial\/_next\/image?url=https%3A%2F%2Fassets.editorial.aetnd.com%2Fhistory-article-default.desktop.jpg&w=3840&q=75)[1975](\/this-day-in-history\/year\/1975)\\n\\n### [\u201cOne Flew Over the Cuckoo\u2019s Nest\u201d opens in theaters](\/this-day-in-history\/one-flew-over-the-cuckoos-nest-debuts)\\n\\n[Art, Literature and Film History](\/topics\/art-history)\\n\\n![](https:\/\/www.history.com\/editorial\/_next\/image?url=https%3A%2F%2Fassets.editorial.aetnd.com%2Fhistory-article-default.desktop.jpg&w=3840&q=75)[1976](\/this-day-in-history\/year\/1976)\\n\\n### [Patty Hearst out on bail](\/this-day-in-history\/patty-hearst-out-on-bail)\\n\\n[Crime](\/topics\/crime)\\n\\n![](https:\/\/www.history.com\/editorial\/_next\/image?url=https%3A%2F%2Fassets.editorial.aetnd.com%2Fhistory-article-default.desktop.jpg&w=3840&q=75)[1985](\/this-day-in-history\/year\/1985)\\n\\n### [Reagan and Gorbachev hold their first summit meeting](\/this-day-in-history\/reagan-and-gorbachev-hold-their-first-summit-meeting)\\n\\n[Cold War](\/topics\/cold-war)\",\"metadata\":{\"title\":\"President Lincoln delivers Gettysburg Address | November 19, 1863 | HISTORY\",\"description\":\"On November 19, 1863, at the dedication of a military cemetery at Gettysburg, Pennsylvania, during the American Civil War, President Lincoln delivers one of the most famous speeches in American history: the Gettysburg Address.\",\"language\":\"en\",\"robots\":\"index, follow\",\"ogTitle\":\"President Lincoln delivers Gettysburg Address | November 19, 1863 | HISTORY\",\"ogDescription\":\"On November 19, 1863, at the dedication of a military cemetery at Gettysburg, Pennsylvania, during the American Civil War, President Lincoln delivers one of the most famous speeches in American history: the Gettysburg Address.\",\"ogUrl\":\"https:\/\/www.history.com\/this-day-in-history\/lincoln-delivers-gettysburg-address\",\"ogImage\":\"https:\/\/assets.editorial.aetnd.com\/uploads\/2012\/05\/this-day-in-history-11-19-1863-lincoln-gettysburg-address.jpg\",\"ogLocale\":\"en_US\",\"ogLocaleAlternate\":[],\"ogSiteName\":\"HISTORY\",\"og:date\":\"2010-03-10T14:27:52\",\"viewport\":\"width=device-width, initial-scale=1\",\"theme-color\":\"#000000\",\"msapplication-TileColor\":\"#1d428a\",\"og:locale\":\"en_US\",\"og:type\":\"article\",\"og:title\":\"President Lincoln delivers Gettysburg Address | November 19, 1863 | HISTORY\",\"og:description\":\"On November 19, 1863, at the dedication of a military cemetery at Gettysburg, Pennsylvania, during the American Civil War, President Lincoln delivers one of the most famous speeches in American history: the Gettysburg Address.\",\"og:url\":\"https:\/\/www.history.com\/this-day-in-history\/lincoln-delivers-gettysburg-address\",\"og:site_name\":\"HISTORY\",\"og:image\":\"https:\/\/assets.editorial.aetnd.com\/uploads\/2012\/05\/this-day-in-history-11-19-1863-lincoln-gettysburg-address.jpg\",\"og:image:secure_url\":\"https:\/\/assets.editorial.aetnd.com\/uploads\/2012\/05\/this-day-in-history-11-19-1863-lincoln-gettysburg-address.jpg\",\"og:image:width\":\"1024\",\"og:image:height\":\"576\",\"twitter:card\":\"summary_large_image\",\"twitter:description\":\"On November 19, 1863, at the dedication of a military cemetery at Gettysburg, Pennsylvania, during the American Civil War, President Lincoln delivers one of the most famous speeches in American history: the Gettysburg Address.\",\"twitter:image\":\"https:\/\/assets.editorial.aetnd.com\/uploads\/2012\/05\/this-day-in-history-11-19-1863-lincoln-gettysburg-address.jpg\",\"google-site-verification\":\"91CWuHRY6kFZq2UzVQsD1stdYEf2zriY8lTCLFzfOmk\",\"next-head-count\":\"27\",\"sourceURL\":\"https:\/\/www.history.com\/this-day-in-history\/lincoln-delivers-gettysburg-address\",\"statusCode\":200}}}" -} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-566ab17bb6275aec1c9b3987dfebd126.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-566ab17bb6275aec1c9b3987dfebd126.json deleted file mode 100644 index 69a9258..0000000 --- a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-566ab17bb6275aec1c9b3987dfebd126.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "access-control-allow-origin": "*", - "x-ratelimit-limit": "500", - "x-ratelimit-remaining": "499" - }, - "data": "{\"searchParameters\":{\"q\":\"\\\"American Civil War\\\" timeline 1861 \\\"Fort Sumter\\\" \\\"Bull Run\\\" \\\"Battle of Shiloh\\\" effects\",\"type\":\"search\",\"num\":10,\"engine\":\"google\"},\"organic\":[],\"credits\":1}" -} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-6569dc605a724876f77e71cee5a3192d.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-6569dc605a724876f77e71cee5a3192d.json deleted file mode 100644 index 271cb6f..0000000 --- a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-6569dc605a724876f77e71cee5a3192d.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "access-control-allow-origin": "*", - "x-ratelimit-limit": "500" - }, - "data": "{\"searchParameters\":{\"q\":\"American Civil War summary timeline, Battle of Gettysburg 1863, General Grant's leadership, Sherman's March to the Sea, Confederate General Lee's surrender at Appomattox Court House 1865, post-war Reconstruction\",\"type\":\"search\",\"num\":10,\"engine\":\"google\"},\"organic\":[{\"title\":\"Civil War Timeline - Gettysburg National Military Park (U.S. National ...\",\"link\":\"https://www.nps.gov/gett/learn/historyculture/civil-war-timeline.htm\",\"snippet\":\"It was here that US General Ulysses S. Grant gained his nickname \\\"Unconditional Surrender\\\" Grant. February 22, 1862- Jefferson Davis is inaugurated as President ...\",\"position\":1},{\"title\":\"Appomattox Court House - American Battlefield Trust\",\"link\":\"https://www.battlefields.org/learn/civil-war/battles/appomattox-court-house\",\"snippet\":\"Trapped by the Federals near Appomattox Court House, Confederate general Robert E. Lee surrendered his army to Union general Ulysses S. Grant.\",\"attributes\":{\"Missing\":\"1863, Reconstruction\"},\"position\":2},{\"title\":\"American Civil War | Timeline | Britannica\",\"link\":\"https://www.britannica.com/summary/American-Civil-War-Timeline\",\"snippet\":\"May\u2013July 1863 ... In the western theater of the war, General Ulysses S. Grant lays siege to the Confederate stronghold of Vicksburg, Mississippi. The Confederates ...\",\"attributes\":{\"Missing\":\"leadership, Reconstruction\"},\"position\":3},{\"title\":\"Civil War Timeline | American Battlefield Trust\",\"link\":\"https://www.battlefields.org/learn/articles/day-civil-war\",\"snippet\":\"Explore our timeline of the American Civil War and learn about the important events and battles that happened throughout this period of American history.\",\"date\":\"Feb 3, 2010\",\"position\":4},{\"title\":\"1863 | Civil War Glass Negatives and Related Prints\",\"link\":\"https://www.loc.gov/collections/civil-war-glass-negatives/articles-and-essays/time-line-of-the-civil-war/1863/\",\"snippet\":\"The Gettysburg Campaign\u200b\u200b Confederate General Lee decided to take the war to the enemy. On June 13, he defeated Union forces at Winchester, Virginia, and ...\",\"attributes\":{\"Missing\":\"leadership, Sea, Appomattox Court House Reconstruction\"},\"position\":5},{\"title\":\"Major Battles and Campaigns of the Civil War - American History\",\"link\":\"https://guides.lib.jjay.cuny.edu/c.php?g=288398&p=4496547\",\"snippet\":\"Fought on April 9 1865, the final battle between the forces of General Ulysses Grant and General Robert E Lee was the Battle of Appomattox Court ...\",\"date\":\"Sep 30, 2024\",\"position\":6},{\"title\":\"American Civil War - Wikipedia\",\"link\":\"https://en.wikipedia.org/wiki/American_Civil_War\",\"snippet\":\"The Confederates abandoned Richmond, and on April 9, 1865, Lee surrendered to Grant following the Battle of Appomattox Court House, setting in motion the end of ...\",\"position\":7},{\"title\":\"Sherman's March to the Sea | Significance, Map, Casualties, & The ...\",\"link\":\"https://www.britannica.com/topic/Shermans-March-to-the-Sea\",\"snippet\":\"The war effectively ended in April 1865 when Confederate General Robert E. Lee surrendered his troops to Union General Ulysses S. Grant at ...\",\"date\":\"5 days ago\",\"position\":8},{\"title\":\"Civil War Overview\",\"link\":\"https://www.civilwar.com/overview/timeline-18354/148542-civil-war-overview.html\",\"snippet\":\"This summary, organized yearly through maps and chronologies, shows the course of the war from Fort Sumter in 1861 to Appomattox Court House and beyond in 1865.\",\"position\":9},{\"title\":\"[PDF] American History What Was the Biggest Turning Point of the Civil ...\",\"link\":\"https://www.trumanlibrary.gov/public/Election1864-Material.pdf\",\"snippet\":\"Sherman's March to the Sea. -. The focus of Sherman's March was to destroy the Confederacy's capacity to make war. Railroads were a major target for Sherman.\",\"position\":10}],\"peopleAlsoAsk\":[{\"question\":\"What was the Civil War summary?\",\"snippet\":\"The Civil War was America's bloodiest and most divisive conflict, pitting the Union Army against the Confederate States of America. The war resulted in the deaths of more than 620,000 people, with millions more injured and the South left in ruins.\",\"title\":\"American Civil War: Causes, Dates & Battles | HISTORY\",\"link\":\"https://www.history.com/topics/american-civil-war\"},{\"question\":\"What 10 events happened in the Civil War?\",\"snippet\":\"SIGNIFICANT CIVIL WAR BATTLES\\nApril 12, 1861: Battle of Fort Sumter. ...\\nJune 30, 1861: Battle of Philippi. ...\\nJuly 21, 1861: First Battle of Bull Run/First Battle of Manassas. ...\\nAugust 28-29, 1861: Battle of Hatteras Inlet Batteries. ...\\nOctober 21, 1861: Battle of Ball's Bluff. ...\\nNovember 7, 1861: Battle of Belmont.\",\"title\":\"Significant Civil War Battles | American Experience - PBS\",\"link\":\"https://www.pbs.org/wgbh/americanexperience/features/timeline-death/\"},{\"question\":\"When was the American Civil War timeline?\",\"snippet\":\"The American Civil War (April 12, 1861 \u2013 May 26, 1865; also known by other names) was a civil war in the United States between the Union (\\\"the North\\\") and the Confederacy (\\\"the South\\\"), which was formed in 1861 by states that had seceded from the Union.\",\"title\":\"American Civil War - Wikipedia\",\"link\":\"https://en.wikipedia.org/wiki/American_Civil_War\"},{\"question\":\"What happened in 1863 during the Civil War?\",\"snippet\":\"1863. January 1, 1863- The Emancipation Proclamation goes into effect. The Emancipation Proclamation was a war measure that declared enslaved people in rebelling states to be free, authorized the enlistment of black troops, and outraged white Southerners.\",\"title\":\"Civil War Timeline - Gettysburg National Military Park (U.S. National ...\",\"link\":\"https://www.nps.gov/gett/learn/historyculture/civil-war-timeline.htm\"}],\"relatedSearches\":[{\"query\":\"Civil War Timeline 1861 To 1865\"},{\"query\":\"Who won the Civil War\"},{\"query\":\"When did the Civil War start and end\"},{\"query\":\"When did the Civil War end\"},{\"query\":\"Civil War battles in order\"},{\"query\":\"What was the first battle of the Civil War\"},{\"query\":\"what general led the confederate army into pennsylvania?\"},{\"query\":\"Where did the Civil War take place\"}],\"credits\":1}" -} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-c94f9a735104da2fd9c0c44ea1ed1ba1.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-c94f9a735104da2fd9c0c44ea1ed1ba1.json deleted file mode 100644 index 6ea1f41..0000000 --- a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-c94f9a735104da2fd9c0c44ea1ed1ba1.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "access-control-allow-origin": "*", - "x-ratelimit-limit": "500" - }, - "data": "{\"searchParameters\":{\"q\":\"Significance of Gettysburg Address 1863, impact on American Civil War\",\"type\":\"search\",\"num\":10,\"engine\":\"google\"},\"answerBox\":{\"snippet\":\"Without mentioning words like \u201cConfederacy,\u201d \u201cslavery,\u201d or \u201csecession\u201d in the Gettysburg Address, Lincoln broadened the objectives of the Civil War to include not just preserving the Union as it was (with slavery largely intact in the South), but also achieving \u201ca new birth of freedom\u201d that would abolish slavery and, ...\",\"title\":\"The Civil War: Lincoln and the Gettysburg Address\",\"link\":\"https:\/\/www.gilderlehrman.org\/sites\/default\/files\/Unit6_Complete_CivilWar_0.pdf\"},\"organic\":[{\"title\":\"President Lincoln delivers Gettysburg Address | November 19, 1863\",\"link\":\"https:\/\/www.history.com\/this-day-in-history\/lincoln-delivers-gettysburg-address\",\"snippet\":\"The speech reflected his redefined belief that the Civil War was not just a fight to save the Union, but a struggle for freedom and equality for ...\",\"date\":\"Mar 10, 2010\",\"position\":1},{\"title\":\"The Gettysburg Address (1863) - The National Constitution Center\",\"link\":\"https:\/\/constitutioncenter.org\/the-constitution\/historic-document-library\/detail\/abraham-lincoln-the-gettysburg-address-1863\",\"snippet\":\"The Union victory at Gettysburg was a key moment in the Civil War\u2014thwarting General Robert E. Lee's invasion of the North. President Lincoln offered this brief ...\",\"position\":2},{\"title\":\"The Gettysburg Address \u2011 Definition, Meaning & Purpose | HISTORY\",\"link\":\"https:\/\/www.history.com\/topics\/american-civil-war\/gettysburg-address\",\"snippet\":\"In it, he invoked the principles of human equality contained in the Declaration of Independence and connected the sacrifices of the Civil War ...\",\"date\":\"Aug 24, 2010\",\"sitelinks\":[{\"title\":\"Gettysburg Address: Lincoln's...\",\"link\":\"https:\/\/www.history.com\/topics\/american-civil-war\/gettysburg-address#section_2\"},{\"title\":\"The Historic Gettysburg Address\",\"link\":\"https:\/\/www.history.com\/topics\/american-civil-war\/gettysburg-address#section_3\"}],\"position\":3},{\"title\":\"Gettysburg Address \u2013 Engage All Abilities\",\"link\":\"https:\/\/depts.washington.edu\/particip\/2019\/05\/06\/gettysburg-address\/\",\"snippet\":\"It added moral force to the Union cause and was a significant milestone leading to the ratification of the 13th Amendment to the Constitution in ...\",\"date\":\"May 6, 2019\",\"position\":4},{\"title\":\"Gettysburg Address Definition, Summary & Significance - Lesson\",\"link\":\"https:\/\/study.com\/academy\/lesson\/gettysburg-address-summary-analysis.html\",\"snippet\":\"The Gettysburg Address's significance is that it sought to give meaning to the sacrifice of soldiers who died during the war.\",\"position\":5},{\"title\":\"Gettysburg Battle Facts and Summary - American Battlefield Trust\",\"link\":\"https:\/\/www.battlefields.org\/learn\/civil-war\/battles\/gettysburg\",\"snippet\":\"Gettysburg ended Confederate general Robert E. Lee's ambitious second quest to invade the North and bring the Civil War to a swift end. The loss there dashed ...\",\"position\":6},{\"title\":\"The Gettysburg Address, 1863\",\"link\":\"https:\/\/www.gilderlehrman.org\/history-resources\/spotlight-primary-source\/gettysburg-address-1863\",\"snippet\":\"Lincoln's three-minute-long Gettysburg Address defined the meaning of the Civil War. Drawing upon the biblical concepts of suffering, consecration, and ...\",\"position\":7},{\"title\":\"Gettysburg Address | Abraham Lincoln Presidential Library and ...\",\"link\":\"https:\/\/presidentlincoln.illinois.gov\/visit\/whats-inside\/exhibits\/online-exhibits\/gettysburg-address-everett-copy\/\",\"snippet\":\"Lincoln is saying the Civil War is not just about the United States's future but is a test of whether any nation built on the promise of liberty and equality ...\",\"position\":8},{\"title\":\"Today in History - November 19 | Library of Congress\",\"link\":\"https:\/\/www.loc.gov\/item\/today-in-history\/november-19\/\",\"snippet\":\"On November 19, 1863, President Abraham Lincoln delivered a short speech at the close of ceremonies dedicating the battlefield cemetery at Gettysburg, ...\",\"date\":\"Nov 19, 2023\",\"position\":9}],\"peopleAlsoAsk\":[{\"question\":\"What impact did the Gettysburg Address have on the Civil War?\",\"snippet\":\"In his address, President Lincoln invoked the Declaration of Independence, and its principles of liberty and equality, and spoke of \u201ca new birth of freedom\u201d for the nation. He continued to reshape the aims of the war for the American people-transforming it from a war for Union to a war for Union and freedom.\\nMay 6, 2019\",\"title\":\"Gettysburg Address \u2013 Engage All Abilities\",\"link\":\"https:\/\/depts.washington.edu\/particip\/2019\/05\/06\/gettysburg-address\/\"},{\"question\":\"What was Gettysburg impact on the Civil War?\",\"snippet\":\"Union victory. Gettysburg ended Confederate general Robert E. Lee's ambitious second quest to invade the North and bring the Civil War to a swift end. The loss there dashed the hopes of the Confederate States of America to become an independent nation.\",\"title\":\"Gettysburg Battle Facts and Summary - American Battlefield Trust\",\"link\":\"https:\/\/www.battlefields.org\/learn\/civil-war\/battles\/gettysburg\"},{\"question\":\"What was the significance of the Gettysburg Address for slavery?\",\"snippet\":\"The speech was a turning point in his war strategy in that, for the first time, he began to openly speak of the abolition of slavery as a desired outcome of the war, a \\\"new birth of freedom.\\\" The mural above depicts an allegory of emancipation in the center.\",\"title\":\"Lincoln Memorial: Emancipation & Gettysburg Address\",\"link\":\"https:\/\/www.nps.gov\/places\/000\/lincoln-memorial-emancipation-gettysburg-address.htm\"},{\"question\":\"What was the significance of the Civil War in 1863?\",\"snippet\":\"On January 1, 1863, Abraham Lincoln issued the final Emancipation Proclamation, which declared that all slaves within the rebellious states \u201care, and henceforward shall be free.\u201d Bitterly denounced in the South\u2014and by many in the North\u2014the Proclamation reduced the likelihood that the anti-slavery European powers would ...\",\"title\":\"December 1862\u2013October 1863 - The Civil War in America | Exhibitions\",\"link\":\"https:\/\/www.loc.gov\/exhibits\/civil-war-in-america\/december-1862-october-1863.html\"}],\"relatedSearches\":[{\"query\":\"How did the Gettysburg Address impact the Civil War\"},{\"query\":\"Why was the Gettysburg Address important\"},{\"query\":\"Why is the Gettysburg Address important today\"},{\"query\":\"What was the purpose of the Gettysburg Address\"},{\"query\":\"Gettysburg Address text\"},{\"query\":\"Gettysburg Address meaning line by line\"},{\"query\":\"Gettysburg Address summary\"},{\"query\":\"Who was the audience of the Gettysburg Address\"}],\"credits\":1}" -} diff --git a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-d4bf31054d2e78fbc5e45673b16c9a89.json b/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-d4bf31054d2e78fbc5e45673b16c9a89.json deleted file mode 100644 index 7c3930c..0000000 --- a/tests/Fixtures/Saloon/AgentChains/Rat/RatAgentChainSerperTool-d4bf31054d2e78fbc5e45673b16c9a89.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "access-control-allow-origin": "*", - "x-ratelimit-limit": "500" - }, - "data": "{\"searchParameters\":{\"q\":\"American Civil War 1862 key events Emancipation Proclamation and Battle of Antietam\",\"type\":\"search\",\"num\":10,\"engine\":\"google\"},\"answerBox\":{\"snippet\":\"On Sept. 22, 1862, President Abraham Lincoln changed the course of American history by announcing that enslaved people would soon be free. Commonly referred to as the 'preliminary' Emancipation Proclamation, Lincoln's action that day was emboldened by a Union victory at the Battle of Antietam only days earlier.\",\"snippetHighlighted\":[\"Sept.\",\"22, 1862, President Abraham Lincoln changed the course of American history by announcing that enslaved people would soon be free\"],\"title\":\"160 years later: Remembering the Battle of Antietam and the ...\",\"link\":\"https:\/\/www.georgiasouthern.edu\/news\/2022\/09\/27\/160-years-later-remembering-the-battle-of-antietam-and-the-preliminary-emancipation-proclamation-that-reshaped-american-history\/\",\"date\":\"Sep 27, 2022\"},\"organic\":[{\"title\":\"Antietam Battle Facts and Summary | American Battlefield Trust\",\"link\":\"https:\/\/www.battlefields.org\/learn\/civil-war\/battles\/antietam\",\"snippet\":\"Antietam, the deadliest one-day battle in American military history, showed that the Union could stand against the Confederate army in the Eastern theater.\",\"position\":1},{\"title\":\"American Civil War - Battle of Antietam, Emancipation Proclamation ...\",\"link\":\"https:\/\/www.britannica.com\/event\/American-Civil-War\/The-war-in-1862\",\"snippet\":\"The year 1862 marked a major turning point in the war, especially the war in the East, as Lee took command of the Confederate army.\",\"date\":\"Oct 11, 2024\",\"position\":2},{\"title\":\"1862 | Civil War Glass Negatives and Related Prints\",\"link\":\"https:\/\/www.loc.gov\/collections\/civil-war-glass-negatives\/articles-and-essays\/time-line-of-the-civil-war\/1862\/\",\"snippet\":\"On January 27, President Lincoln issued a war order authorizing the Union to launch a unified aggressive action against the Confederacy.\",\"position\":3},{\"title\":\"Civil War Timeline - Gettysburg National Military Park (U.S. National ...\",\"link\":\"https:\/\/www.nps.gov\/gett\/learn\/historyculture\/civil-war-timeline.htm\",\"snippet\":\"September 22, 1862- Following the US victory at Antietam, President Lincoln introduces the Preliminary Emancipation Proclamation, which announced Lincoln's ...\",\"position\":4},{\"title\":\"Emancipation Proclamation (1863) - National Archives\",\"link\":\"https:\/\/www.archives.gov\/milestone-documents\/emancipation-proclamation\",\"snippet\":\"President Abraham Lincoln issued the Emancipation Proclamation on January 1, 1863, announcing, \\\"that all persons held as slaves\\\" within the rebellious areas \\\" ...\",\"date\":\"May 10, 2022\",\"position\":5},{\"title\":\"Emancipation Proclamation \u2011 Definition, Dates & Summary | HISTORY\",\"link\":\"https:\/\/www.history.com\/topics\/american-civil-war\/emancipation-proclamation\",\"snippet\":\"On September 22, 1862, President Abraham Lincoln issued the preliminary Emancipation Proclamation, which declared that as of January 1, 1863, all enslaved ...\",\"date\":\"Oct 29, 2009\",\"position\":6},{\"title\":\"Timeline | Abraham Lincoln and Emancipation | Articles and Essays\",\"link\":\"https:\/\/www.loc.gov\/collections\/abraham-lincoln-papers\/articles-and-essays\/abraham-lincoln-and-emancipation\/timeline\/\",\"snippet\":\"1862, Sept.\u200b\u200b President Lincoln issued the Preliminary Emancipation Proclamation, declaring that as of January 1, 1863 \\\"all persons held as slaves within any ...\",\"position\":7},{\"title\":\"Freedom at Antietam - National Park Service\",\"link\":\"https:\/\/www.nps.gov\/anti\/learn\/historyculture\/freedom-at-antietam.htm\",\"snippet\":\"Five days after the battle, armed with pen and paper, Abraham Lincoln changed the war when he issued the Emancipation Proclamation. The ...\",\"date\":\"Sep 15, 2023\",\"position\":8},{\"title\":\"7 Ways the Battle of Antietam Changed America | HISTORY\",\"link\":\"https:\/\/www.history.com\/news\/7-ways-the-battle-of-antietam-changed-america\",\"snippet\":\"The battle allowed Abraham Lincoln to issue the Emancipation Proclamation. For two months, Lincoln's order proclaiming the freedom of enslaved ...\",\"date\":\"Sep 14, 2012\",\"position\":9}],\"peopleAlsoAsk\":[{\"question\":\"What was the Battle of Antietam and Emancipation Proclamation?\",\"snippet\":\"As the glowing sun set over the bloody fields of Antietam, the Civil War became a different war. Five days after the battle, armed with pen and paper, Abraham Lincoln changed the war when he issued the Emancipation Proclamation. The proclamation reflected Lincoln's new way of thinking about the conflict.\\nSep 15, 2023\",\"title\":\"Freedom at Antietam - National Park Service\",\"link\":\"https:\/\/www.nps.gov\/anti\/learn\/historyculture\/freedom-at-antietam.htm\"},{\"question\":\"What key events happened in the Antietam Battle?\",\"snippet\":\"September 17. The Battle of Antietam begins at dawn when Hooker's Union corps mounts a powerful assault on Lee's left flank. Repeated Union attacks and equally vicious Confederate counterattacks sweep back and forth across Miller's cornfield and the West Woods.\",\"title\":\"Antietam Battle Facts and Summary | American Battlefield Trust\",\"link\":\"https:\/\/www.battlefields.org\/learn\/civil-war\/battles\/antietam\"},{\"question\":\"What three events happened in 1862 civil war?\",\"snippet\":\"1862\\nJanuary 1862. Abraham Lincoln Takes Action. ...\\nMarch 1862. McClellan Loses Command. ...\\nApril 1862. The Battle of Shiloh. ...\\nApril 1862. New Orleans. ...\\nApril 1862. The Peninsular Campaign. ...\\nMay 1862. \\\"Stonewall\\\" Jackson Defeats Union Forces. ...\\nJune 1862. The Battle of Seven Pines (Fair Oaks) ...\\nJuly 1862. The Seven Days' Battles.\",\"title\":\"1862 | Civil War Glass Negatives and Related Prints\",\"link\":\"https:\/\/www.loc.gov\/collections\/civil-war-glass-negatives\/articles-and-essays\/time-line-of-the-civil-war\/1862\/\"},{\"question\":\"What happened at the Battle of Antietam in 1862?\",\"snippet\":\"The Battle of Antietam ended the Confederate Army of Northern Virginia's first invasion into the North and led Abraham Lincoln to issue the preliminary Emancipation Proclamation.\",\"title\":\"Antietam National Battlefield (U.S. National Park Service)\",\"link\":\"https:\/\/www.nps.gov\/ancm\/\"}],\"relatedSearches\":[{\"query\":\"Who won the Battle of Antietam\"},{\"query\":\"1862 Civil War Timeline\"},{\"query\":\"1862 Civil War Battle\"},{\"query\":\"Where was the Battle of Antietam\"},{\"query\":\"Why was the Battle of Antietam important\"},{\"query\":\"What happened in 1862 in American History\"},{\"query\":\"Battle of Antietam casualties\"},{\"query\":\"When did the Battle of Antietam end\"}],\"credits\":1}" -} diff --git a/tests/Fixtures/Saloon/Agents/ChatRephraseAgent-a4f1718f3bd597aaa73aabb90ccb115b.json b/tests/Fixtures/Saloon/Agents/ChatRephraseAgent-a4f1718f3bd597aaa73aabb90ccb115b.json deleted file mode 100644 index 50e3c43..0000000 --- a/tests/Fixtures/Saloon/Agents/ChatRephraseAgent-a4f1718f3bd597aaa73aabb90ccb115b.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Fri, 11 Oct 2024 22:52:21 GMT", - "Content-Type": "application\/json", - "Content-Length": "711", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AHImZj9bW9sqXPa4GJT48mugS5Pe8\",\n \"object\": \"chat.completion\",\n \"created\": 1728687139,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"standalone_question\\\": \\\"How can one improve heart health?\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 237,\n \"completion_tokens\": 20,\n \"total_tokens\": 257,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_4dba7dd7b3\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Agents/ChatRephraseAgent-d53f1768c34d5c32774aa924150302a0.json b/tests/Fixtures/Saloon/Agents/ChatRephraseAgent-d53f1768c34d5c32774aa924150302a0.json deleted file mode 100644 index bb11931..0000000 --- a/tests/Fixtures/Saloon/Agents/ChatRephraseAgent-d53f1768c34d5c32774aa924150302a0.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:28:22 GMT", - "Content-Type": "application/json", - "Content-Length": "725", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "858", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999656", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "10ms", - "x-request-id": "req_92c7ea6e5c16152c129ec11fb2b5e172", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=hPO2vobWRuUv61gTCjPAtKKvr39Q1OnxRrf10QS4M7k-1729560502-1.0.1.1-JBD.hk0I9T3n5HJYqlEur46jtDmEFNfy0XU9XtC1Q00Aba3nkBLLxYwL6cv1LgwylMp1jmDiblV7f4lIWDCBBw; path=/; expires=Tue, 22-Oct-24 01:58:22 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=8uibqfRpr59vivboYsljTlOiDpo5lseCEddnNsMZR_s-1729560502072-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b5cbdeef8c9c-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKxz3P5k2zvdYdRlwudwl1TUpr6hK\",\n \"object\": \"chat.completion\",\n \"created\": 1729560501,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"standalone_question\\\": \\\"How can one improve heart health through gym activities?\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 272,\n \"completion_tokens\": 20,\n \"total_tokens\": 292,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Agents/ChatRephraseAgent-d64a50cbac93e15e519fe16f1c1e212f.json b/tests/Fixtures/Saloon/Agents/ChatRephraseAgent-d64a50cbac93e15e519fe16f1c1e212f.json deleted file mode 100644 index 04a8268..0000000 --- a/tests/Fixtures/Saloon/Agents/ChatRephraseAgent-d64a50cbac93e15e519fe16f1c1e212f.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Thu, 10 Oct 2024 23:46:06 GMT", - "Content-Type": "application/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "937", - "openai-version": "2020-10-01", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999707", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "8ms", - "x-request-id": "req_466c5caeb7b01c1b342b0548e150e60a", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=lT7uuqpRmkdYPIZTxNszN9rQM2PCT.dOEShecigouTk-1728603966-1.0.1.1-gQjC7x4jXAEUGjoDV0voBu_ddONefTrcC7M0Q88buScHWXOLcBcFSNv94Cjznw_qrDdlyQs.m67Hg8jyz0W6ig; path=/; expires=Fri, 11-Oct-24 00:16:06 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=WO504wXXEuVagLPYoXsRfBJv3MNEzHnkOqHmuvYuDnE-1728603966902-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d0a7ce199754228-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AGx93EGjkiQ6K7Aa6ZzxoCEB3KGyV\",\n \"object\": \"chat.completion\",\n \"created\": 1728603965,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"standalone_question\\\": \\\"How can I improve my heart health?\\\"\\n}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 228,\n \"completion_tokens\": 17,\n \"total_tokens\": 245,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"text_tokens\": 0,\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Agents/ContextualRetrievalPreprocessingAgent.json b/tests/Fixtures/Saloon/Agents/ContextualRetrievalPreprocessingAgent.json deleted file mode 100644 index 51ccb07..0000000 --- a/tests/Fixtures/Saloon/Agents/ContextualRetrievalPreprocessingAgent.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Thu, 10 Oct 2024 23:58:35 GMT", - "Content-Type": "application\/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "2732", - "openai-version": "2020-10-01", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1997322", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "80ms", - "x-request-id": "req_ab84df451a89637d134760104ae48bad", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=AhLoXBbn3OzdlEllguFPNaFudNQpKGo9i_gua7zIcAE-1728604715-1.0.1.1-IdfQYmWUy1s_BsQ_L1NMVpUK9CAona790V7.04ICQswYNV6.HVukbkWmetOun.1TnmQUXNbWQ9dVjyGeANx4jA; path=\/; expires=Fri, 11-Oct-24 00:28:35 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=aHNU2z6QsonPQ3BlCkw9TJ1oTldy6QgvnTMbZlKFmG4-1728604715005-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d0a8f19ea5643a5-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AGxL6JQFm5WvSWvPykmwbGi9BSTwN\",\n \"object\": \"chat.completion\",\n \"created\": 1728604712,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"succinct_context\\\": \\\"This chunk introduces the DiffExecutor struct which plays a central role in the differential fuzzing system by wrapping two executors. The primary and secondary executors are designed to run sequentially with the same input to differentiate their behavior.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 2878,\n \"completion_tokens\": 57,\n \"total_tokens\": 2935,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"text_tokens\": 0,\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_4dba7dd7b3\"\n}\n" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Agents/ImageAgentTestAgent.json b/tests/Fixtures/Saloon/Agents/ImageAgentTestAgent.json deleted file mode 100644 index bfe36bb..0000000 --- a/tests/Fixtures/Saloon/Agents/ImageAgentTestAgent.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Thu, 10 Oct 2024 22:47:17 GMT", - "Content-Type": "application\/json", - "Content-Length": "841", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "3676", - "openai-version": "2020-10-01", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999153", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "25ms", - "x-request-id": "req_19ed4b03924a5d386a174708d90cfb1d", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=jIRlgtwCiOdu6yO24UbkZ_g_vf72leXRHw0icYGYpVw-1728600437-1.0.1.1-7MQX6IX35AO2alxv8cNLWRGJe1TTgyRKKpwFtBMMeAW6Rsg9CTMCfZH6Z4Q10yufn7zMaxPQXF225gTYjElacg; path=\/; expires=Thu, 10-Oct-24 23:17:17 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=fsZzoR20DPpq8.CklM7c1bQPPgrMgf1WmQQ7SnGDdzA-1728600437100-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d0a26a26f490f9d-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AGwE6enS8XIpfXZl43DERfaMsBlat\",\n \"object\": \"chat.completion\",\n \"created\": 1728600434,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Crawler Options #\\\\n\\\\nYou can also pass params to the loader. This is a dictionary of options to pass to the crawler. See the FireCrawl API documentation for more information.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 491,\n \"completion_tokens\": 50,\n \"total_tokens\": 541,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_4dba7dd7b3\"\n}\n" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Agents/MultiQueryRetrieverAgent-6a3bece603a588c169c067f3b13d3f04.json b/tests/Fixtures/Saloon/Agents/MultiQueryRetrieverAgent-6a3bece603a588c169c067f3b13d3f04.json deleted file mode 100644 index 5d1c591..0000000 --- a/tests/Fixtures/Saloon/Agents/MultiQueryRetrieverAgent-6a3bece603a588c169c067f3b13d3f04.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Thu, 10 Oct 2024 22:53:11 GMT", - "Content-Type": "application/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AGwJnsnfjDl2Cl0JTIrJASqI7VJxW\",\n \"object\": \"chat.completion\",\n \"created\": 1728600787,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"answer\\\": [\\n \\\"Which exercises at the gym are best for cardiovascular health?\\\",\\n \\\"What are the most effective gym workouts to improve heart function?\\\",\\n \\\"Can you suggest some gym routines that benefit heart health?\\\",\\n \\\"What types of gym activities are good for strengthening the heart?\\\",\\n \\\"Which fitness center exercises could help in enhancing heart health?\\\"\\n ]\\n}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 140,\n \"completion_tokens\": 76,\n \"total_tokens\": 216,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Agents/MultiQueryRetrieverAgent-d54e72acfb8432e3c4ce48cab4f69391.json b/tests/Fixtures/Saloon/Agents/MultiQueryRetrieverAgent-d54e72acfb8432e3c4ce48cab4f69391.json deleted file mode 100644 index 1bfa82c..0000000 --- a/tests/Fixtures/Saloon/Agents/MultiQueryRetrieverAgent-d54e72acfb8432e3c4ce48cab4f69391.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:28:25 GMT", - "Content-Type": "application\/json", - "Content-Length": "1057", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "2499", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999773", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "6ms", - "x-request-id": "req_c2003d4df94f5d76587d213b8e2c6019", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=PYizbeamYDO0AtQDPhtzpVN1Zn._kgqTMunqMSZ7skg-1729560505-1.0.1.1-wXqtr1GxAEswcMzw51eNuZpN.Lnii_6xliCDPdfWV87pExEOJ81H2gGVlr.fsw2dwdoTzM9lAzfQeklTfe19mQ; path=\/; expires=Tue, 22-Oct-24 01:58:25 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=7anOzpNsNSahAxndBxMCshFUOqEqngNywz1TRH5Ogis-1729560505780-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b5d8ae9842a5-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKxz5Q8DNUTvqYVNMoCkbfKvQ4dId\",\n \"object\": \"chat.completion\",\n \"created\": 1729560503,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"answer\\\": [\\n \\\"Which exercise routines at the gym are beneficial for cardiovascular health?\\\",\\n \\\"What are the best gym workouts to improve heart function?\\\",\\n \\\"Can you suggest some cardio exercises at the gym for heart health?\\\",\\n \\\"What types of gym activities help in strengthening the heart?\\\",\\n \\\"Which gym exercises are most effective for enhancing cardiac health?\\\"\\n ]\\n}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 175,\n \"completion_tokens\": 77,\n \"total_tokens\": 252,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Agents/SQLToolAgent-09920d4481a4771ce866d0c345e25a91.json b/tests/Fixtures/Saloon/Agents/SQLToolAgent-09920d4481a4771ce866d0c345e25a91.json deleted file mode 100644 index 55fa026..0000000 --- a/tests/Fixtures/Saloon/Agents/SQLToolAgent-09920d4481a4771ce866d0c345e25a91.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Wed, 16 Oct 2024 23:00:59 GMT", - "Content-Type": "application\/json", - "Content-Length": "769", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AJ7IfEVBjVDymyiFQabiIA1NPBP7z\",\n \"object\": \"chat.completion\",\n \"created\": 1729119657,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"There are 100 organizations currently operating, and the average number of funding rounds for them is 5.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1247,\n \"completion_tokens\": 33,\n \"total_tokens\": 1280,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Agents/SQLToolAgent-0b0867cd35d40e15c4e6ee69e34045b9.json b/tests/Fixtures/Saloon/Agents/SQLToolAgent-0b0867cd35d40e15c4e6ee69e34045b9.json deleted file mode 100644 index 32f95cb..0000000 --- a/tests/Fixtures/Saloon/Agents/SQLToolAgent-0b0867cd35d40e15c4e6ee69e34045b9.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Wed, 16 Oct 2024 23:53:58 GMT", - "Content-Type": "application/json", - "Content-Length": "925", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AJ87xAJ2JNm18lP8fPhsoJsYHrEc2\",\n \"object\": \"chat.completion\",\n \"created\": 1729122837,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_YRRYKdXqKRF2k1PUQXPqNujy\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"info_s_q_l_database_tool\",\n \"arguments\": \"{\\\"tables\\\":\\\"organizations\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 449,\n \"completion_tokens\": 18,\n \"total_tokens\": 467,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Agents/SQLToolAgent-0f2cbb046d14f10babf198d5839a56ee.json b/tests/Fixtures/Saloon/Agents/SQLToolAgent-0f2cbb046d14f10babf198d5839a56ee.json deleted file mode 100644 index 9b55d88..0000000 --- a/tests/Fixtures/Saloon/Agents/SQLToolAgent-0f2cbb046d14f10babf198d5839a56ee.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:28:28 GMT", - "Content-Type": "application/json", - "Content-Length": "897", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "796", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999680", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "9ms", - "x-request-id": "req_502461abc2d9db282ec9184222c3ee8d", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=JXmtqFpn2KYYRTuq2_HsolRbSBmUDuJWEtgNNQCXUcQ-1729560508-1.0.1.1-.a91ln2AQjtDtDE_VpUda3KFAug2G0nNgnTcoa04wlWm0tdHFKG795ys6.i8SfNUlmLLfpDF9ETjm7C_KZb85A; path=/; expires=Tue, 22-Oct-24 01:58:28 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=UQgb.hxkKSJoVq2Y2gjp5xKYJqhiBkIJshOsRnhaRaY-1729560508026-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b5ee1c2a7cf6-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKxz9pLzXNEz4PxkGZALXMXcRbAc6\",\n \"object\": \"chat.completion\",\n \"created\": 1729560507,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_UmSgwmAuST5mlWbwTbnyT499\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"list_s_q_l_database_tool\",\n \"arguments\": \"{}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 423,\n \"completion_tokens\": 14,\n \"total_tokens\": 437,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Agents/SQLToolAgent-1ba56f98ec619524c9cc046a17ce54c0.json b/tests/Fixtures/Saloon/Agents/SQLToolAgent-1ba56f98ec619524c9cc046a17ce54c0.json deleted file mode 100644 index 4379236..0000000 --- a/tests/Fixtures/Saloon/Agents/SQLToolAgent-1ba56f98ec619524c9cc046a17ce54c0.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Wed, 16 Oct 2024 23:00:52 GMT", - "Content-Type": "application/json", - "Content-Length": "897", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AJ7IZUfcmlHQYRe4MryCo6Bi5KEo0\",\n \"object\": \"chat.completion\",\n \"created\": 1729119651,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_YGFnHjZAty54Rw5pap6M3qtE\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"list_s_q_l_database_tool\",\n \"arguments\": \"{}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 388,\n \"completion_tokens\": 14,\n \"total_tokens\": 402,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Agents/SQLToolAgent-1f623066a9197d1a4b395fa6a7079da3.json b/tests/Fixtures/Saloon/Agents/SQLToolAgent-1f623066a9197d1a4b395fa6a7079da3.json deleted file mode 100644 index 1e62479..0000000 --- a/tests/Fixtures/Saloon/Agents/SQLToolAgent-1f623066a9197d1a4b395fa6a7079da3.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:28:31 GMT", - "Content-Type": "application/json", - "Content-Length": "925", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "833", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999577", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "12ms", - "x-request-id": "req_11b9677b9ae15f3a78a540efc873ea3e", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=QGlqwaczD6k0rsD1TwdBy4dLtLIHUpv5nUumNVvX720-1729560511-1.0.1.1-UHPXa5jXvG9Hag3ztcEsBmJeaATBM.KKJ2.0L_5Y4YaidaXcL48ZPurCLqGox7ZytfmIt9NkMVblJW3Lhrt5kA; path=/; expires=Tue, 22-Oct-24 01:58:31 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=qoHc98fgxNE4IvtxmiWkTyJBFwiM629PEtjuVk1WiQo-1729560511656-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b607cd398ccd-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKxzCTjYgxnslLxs7ywdHc5M5HHC6\",\n \"object\": \"chat.completion\",\n \"created\": 1729560510,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_mRECkNXbFwzmdokaTUYG3ufG\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"info_s_q_l_database_tool\",\n \"arguments\": \"{\\\"tables\\\":\\\"organizations\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 602,\n \"completion_tokens\": 18,\n \"total_tokens\": 620,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Agents/SQLToolAgent-2065af6d3f057153a11772603ec65f5e.json b/tests/Fixtures/Saloon/Agents/SQLToolAgent-2065af6d3f057153a11772603ec65f5e.json deleted file mode 100644 index adb0863..0000000 --- a/tests/Fixtures/Saloon/Agents/SQLToolAgent-2065af6d3f057153a11772603ec65f5e.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Wed, 16 Oct 2024 23:00:57 GMT", - "Content-Type": "application/json", - "Content-Length": "1050", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AJ7IdZYUDQ9fV9dniXMhPPO9ihjDA\",\n \"object\": \"chat.completion\",\n \"created\": 1729119655,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_GLbIHjARoUJh2a5aPJg9FI6l\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"query_s_q_l_data_base_tool\",\n \"arguments\": \"{\\\"query\\\":\\\"SELECT COUNT(*) AS total_organizations, AVG(num_funding_rounds) AS average_funding_rounds FROM organizations WHERE status = 'operating'\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1170,\n \"completion_tokens\": 48,\n \"total_tokens\": 1218,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Agents/SQLToolAgent-58b2f699ebef4cb1ebebf4221b228d5e.json b/tests/Fixtures/Saloon/Agents/SQLToolAgent-58b2f699ebef4cb1ebebf4221b228d5e.json deleted file mode 100644 index 73ad098..0000000 --- a/tests/Fixtures/Saloon/Agents/SQLToolAgent-58b2f699ebef4cb1ebebf4221b228d5e.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Wed, 16 Oct 2024 23:53:57 GMT", - "Content-Type": "application\/json", - "Content-Length": "897", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "819", - "openai-version": "2020-10-01" - }, - "data": "{\n \"id\": \"chatcmpl-AJ87wCMef7zUWGnJeUmY6NmE570vD\",\n \"object\": \"chat.completion\",\n \"created\": 1729122836,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_yyXdaOAyYq3qDCmDwDEcC9cB\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"list_s_q_l_database_tool\",\n \"arguments\": \"{}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 388,\n \"completion_tokens\": 14,\n \"total_tokens\": 402,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Agents/SQLToolAgent-6991437c545f65d770fa0188d82516ce.json b/tests/Fixtures/Saloon/Agents/SQLToolAgent-6991437c545f65d770fa0188d82516ce.json deleted file mode 100644 index 5118d14..0000000 --- a/tests/Fixtures/Saloon/Agents/SQLToolAgent-6991437c545f65d770fa0188d82516ce.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Wed, 16 Oct 2024 23:00:55 GMT", - "Content-Type": "application\/json", - "Content-Length": "925", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AJ7Ib9oQgUuOMS47M37qIKsgNf2Qv\",\n \"object\": \"chat.completion\",\n \"created\": 1729119653,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_b0cBDtCvT57IPResDtLVIIkB\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"info_s_q_l_database_tool\",\n \"arguments\": \"{\\\"tables\\\":\\\"organizations\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 449,\n \"completion_tokens\": 18,\n \"total_tokens\": 467,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Agents/SQLToolAgent-aea323a5832b8415f679133f693e2b13.json b/tests/Fixtures/Saloon/Agents/SQLToolAgent-aea323a5832b8415f679133f693e2b13.json deleted file mode 100644 index 7db2297..0000000 --- a/tests/Fixtures/Saloon/Agents/SQLToolAgent-aea323a5832b8415f679133f693e2b13.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:28:36 GMT", - "Content-Type": "application\/json", - "Content-Length": "758", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "2097", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1998911", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "32ms", - "x-request-id": "req_4fce149cbcb9d6e3df26e6378ea6f79d", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=GEUlC5D1qBJOQxhSRrIXSKecbBwRJWCVSiEaZLy0sow-1729560516-1.0.1.1-OhrdDkGPPQ2.2Ux5kfiD7c3zZhuLLCt7Nx.YzNSKE51AbJwTjPWAc8YPW_iztbsBosyD_J1gfpZ.pOK2yM6Ehg; path=\/; expires=Tue, 22-Oct-24 01:58:36 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=FNQjNOID.tCjMYC7IoA_jeQQysF9sKoyOwn0_NBC3l8-1729560516806-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b6201d410cd9-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKxzGkfig1506CY7sOwi4eJVTLgUJ\",\n \"object\": \"chat.completion\",\n \"created\": 1729560514,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"{\\\\n \\\\\\\"total_operating_organizations\\\\\\\": 100,\\\\n \\\\\\\"average_funding_rounds\\\\\\\": 5\\\\n}\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1404,\n \"completion_tokens\": 38,\n \"total_tokens\": 1442,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Agents/SQLToolAgent-ca35aaabff5f4b53409aa9635246f84a.json b/tests/Fixtures/Saloon/Agents/SQLToolAgent-ca35aaabff5f4b53409aa9635246f84a.json deleted file mode 100644 index 31a5210..0000000 --- a/tests/Fixtures/Saloon/Agents/SQLToolAgent-ca35aaabff5f4b53409aa9635246f84a.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Wed, 16 Oct 2024 23:54:01 GMT", - "Content-Type": "application\/json", - "Content-Length": "1054", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AJ87zexuBFOyNj25s7F3amktioBRM\",\n \"object\": \"chat.completion\",\n \"created\": 1729122839,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_fa4zFfmXKbS7y0rEE0N44CSe\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"query_s_q_l_data_base_tool\",\n \"arguments\": \"{\\\"query\\\":\\\"SELECT COUNT(*) AS operating_organizations, AVG(num_funding_rounds) AS average_funding_rounds FROM organizations WHERE status = 'operating'\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1170,\n \"completion_tokens\": 48,\n \"total_tokens\": 1218,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Agents/SQLToolAgent-dbbeef79e6e45bbca928834e33282bd5.json b/tests/Fixtures/Saloon/Agents/SQLToolAgent-dbbeef79e6e45bbca928834e33282bd5.json deleted file mode 100644 index f43d7e4..0000000 --- a/tests/Fixtures/Saloon/Agents/SQLToolAgent-dbbeef79e6e45bbca928834e33282bd5.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:28:30 GMT", - "Content-Type": "application\/json", - "Content-Length": "1054", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "2048", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999638", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "10ms", - "x-request-id": "req_c999edb687ad626728dda2d3855e596a", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=upcl1KdgiKLJ98rMfYbWz3aOU6JPnrOiUHpuZFT4Gxw-1729560510-1.0.1.1-raAredPc2exiKdm_v.AYk0LKwczq485QcxIhJogC04zjUWaSgb61m6k8u1F5kdNk6DKLQWF_ujqOPRvH7lFflw; path=\/; expires=Tue, 22-Oct-24 01:58:30 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=cAAkbxSH6_wTW48Cmejcl7smgtP2yjzbhNKLUKT2.Hc-1729560510391-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b5f859528cbf-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKxzA3EnBjDwKYYEPJwZV1gvKQoPR\",\n \"object\": \"chat.completion\",\n \"created\": 1729560508,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_QPwVBq9tehyE7ecdApXFVy3p\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"query_s_q_l_data_base_tool\",\n \"arguments\": \"{\\\"query\\\":\\\"SELECT COUNT(*) AS total_operating_organizations, AVG(funding_rounds) AS average_funding_rounds FROM organizations WHERE status = 'operating'\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 484,\n \"completion_tokens\": 49,\n \"total_tokens\": 533,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Agents/SQLToolAgent-df626a1c7b4955432c0bc96cdbffe38f.json b/tests/Fixtures/Saloon/Agents/SQLToolAgent-df626a1c7b4955432c0bc96cdbffe38f.json deleted file mode 100644 index 5e48159..0000000 --- a/tests/Fixtures/Saloon/Agents/SQLToolAgent-df626a1c7b4955432c0bc96cdbffe38f.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:28:34 GMT", - "Content-Type": "application\/json", - "Content-Length": "1060", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "2185", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1998930", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "32ms", - "x-request-id": "req_aafe2fd5dbe16429550a7527f2cabbcf", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=JDiVxyYgVNe_yBBxkGfQomTdzG4JoK8E11aLZgycIzE-1729560514-1.0.1.1-1ZSNkZaiLPrky_UFNGJliTFeGRzwIqIULDSsKoYbQ.nHC2OuvB0hVfWSPFh7b6yHthjacqyw1tTb93.QixQUaw; path=\/; expires=Tue, 22-Oct-24 01:58:34 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=mzHdwKR1_IP7tY1cLCCHyeICk34M4fPv1JQg0OXZ0mE-1729560514175-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b60f28834291-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKxzEIQXqjmwtLzc9lBOCexAWCeLu\",\n \"object\": \"chat.completion\",\n \"created\": 1729560512,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_873PdtJ71IOO02xUU6KkokEm\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"query_s_q_l_data_base_tool\",\n \"arguments\": \"{\\\"query\\\":\\\"SELECT COUNT(*) AS total_operating_organizations, AVG(num_funding_rounds) AS average_funding_rounds FROM organizations WHERE status = 'operating'\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1323,\n \"completion_tokens\": 50,\n \"total_tokens\": 1373,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Agents/SQLToolAgent-f31398b834b15382e7ad551a39889dd7.json b/tests/Fixtures/Saloon/Agents/SQLToolAgent-f31398b834b15382e7ad551a39889dd7.json deleted file mode 100644 index 9ae0e7b..0000000 --- a/tests/Fixtures/Saloon/Agents/SQLToolAgent-f31398b834b15382e7ad551a39889dd7.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Wed, 16 Oct 2024 23:54:03 GMT", - "Content-Type": "application/json", - "Content-Length": "760" - }, - "data": "{\n \"id\": \"chatcmpl-AJ8823rTNyertHrdfwPsPmeB0793E\",\n \"object\": \"chat.completion\",\n \"created\": 1729122842,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"There are 100 operating organizations and the average number of funding rounds for them is 5.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1248,\n \"completion_tokens\": 31,\n \"total_tokens\": 1279,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Console/SynapseArtisan-0619d6097b2a0bb5bfb6ef58d9dec10a.json b/tests/Fixtures/Saloon/Console/SynapseArtisan-0619d6097b2a0bb5bfb6ef58d9dec10a.json deleted file mode 100644 index 94e125a..0000000 --- a/tests/Fixtures/Saloon/Console/SynapseArtisan-0619d6097b2a0bb5bfb6ef58d9dec10a.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:28:40 GMT", - "Content-Type": "application\/json", - "Content-Length": "686", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "897", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999539", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "13ms", - "x-request-id": "req_10490703b310d85c036e2e1f8dae319e", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=55P6ASxoIUaoHIJgOdF7qASi3DSyamurOKRInzQtkiY-1729560520-1.0.1.1-0IhzESt4BLKyCFMKWRMgIcv_Az8ntA_vkIbRoaAlNPUqhcuqf9al2QPfp8iQGADFTd332IRcf8_BCdV1MLOgEg; path=\/; expires=Tue, 22-Oct-24 01:58:40 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=IBDk1BFi3MTRT248ag1g44JWc3wgTyVhyMiGURwgGcg-1729560520410-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b63e3b518c51-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKxzLLvd8Tfu3jRyidjalgHiBFVza\",\n \"object\": \"chat.completion\",\n \"created\": 1729560519,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"command\\\": \\\"make:model Flight -m\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 493,\n \"completion_tokens\": 17,\n \"total_tokens\": 510,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Console/SynapseArtisan-a1d524092dba5bbe9f4a0bb7e0b9f909.json b/tests/Fixtures/Saloon/Console/SynapseArtisan-a1d524092dba5bbe9f4a0bb7e0b9f909.json deleted file mode 100644 index 73787c6..0000000 --- a/tests/Fixtures/Saloon/Console/SynapseArtisan-a1d524092dba5bbe9f4a0bb7e0b9f909.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Wed, 16 Oct 2024 21:55:47 GMT", - "Content-Type": "application\/json", - "Content-Length": "688", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AJ6Harhiy1IiRSI7NHNE0pzdk5BoB\",\n \"object\": \"chat.completion\",\n \"created\": 1729115746,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"command\\\": \\\"make:model Plane -m -c\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 512,\n \"completion_tokens\": 19,\n \"total_tokens\": 531,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Console/SynapseArtisan-c1496a59f5142396d808855025edb586.json b/tests/Fixtures/Saloon/Console/SynapseArtisan-c1496a59f5142396d808855025edb586.json deleted file mode 100644 index ae3bae0..0000000 --- a/tests/Fixtures/Saloon/Console/SynapseArtisan-c1496a59f5142396d808855025edb586.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Wed, 16 Oct 2024 21:55:29 GMT", - "Content-Type": "application/json", - "Content-Length": "686", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AJ6HJu0uzlLcWzIvoCbjt8vtYH1jy\",\n \"object\": \"chat.completion\",\n \"created\": 1729115729,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"command\\\": \\\"make:model Flight -m\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 458,\n \"completion_tokens\": 17,\n \"total_tokens\": 475,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_4dba7dd7b3\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Console/SynapseArtisan-d04b51b713a0ff18d2779ed7991fbc0b.json b/tests/Fixtures/Saloon/Console/SynapseArtisan-d04b51b713a0ff18d2779ed7991fbc0b.json deleted file mode 100644 index 98431b7..0000000 --- a/tests/Fixtures/Saloon/Console/SynapseArtisan-d04b51b713a0ff18d2779ed7991fbc0b.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:28:42 GMT", - "Content-Type": "application\/json", - "Content-Length": "688", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "1006", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999494", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "15ms", - "x-request-id": "req_09331ab953779e8e8fa0fb2d0d57675b", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=5XgyM459nLkc9RlYR63oDfEL7w64CmAic2MqckG9vS4-1729560522-1.0.1.1-XDx0oD4aIYopGa_93NH.b5fjWNz5zliz9_Em41fKzJX2Lpd72yoNaBqPJa6LmdueNUC8lSu0.b76EawU5FQiuw; path=\/; expires=Tue, 22-Oct-24 01:58:42 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=dWLooX_xtpDA4mDJi5ryLB2F_kga5Dqp9psHIn38qrQ-1729560522586-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b64b0e464414-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKxzNhcfKVnsynbDO81nnCxxGYzxx\",\n \"object\": \"chat.completion\",\n \"created\": 1729560521,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"command\\\": \\\"make:model Plane -m -c\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 547,\n \"completion_tokens\": 19,\n \"total_tokens\": 566,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Integrations/ClaudeTestAgent-0b01a311e346b7ad882115c9bdbd879c.json b/tests/Fixtures/Saloon/Integrations/ClaudeTestAgent-0b01a311e346b7ad882115c9bdbd879c.json deleted file mode 100644 index 785af61..0000000 --- a/tests/Fixtures/Saloon/Integrations/ClaudeTestAgent-0b01a311e346b7ad882115c9bdbd879c.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Thu, 03 Oct 2024 17:21:07 GMT", - "Content-Type": "application/json", - "Content-Length": "553", - "Connection": "keep-alive" - }, - "data": "{\"id\":\"msg_01NssnktW2V8zuU7Jd46RV7y\",\"type\":\"message\",\"role\":\"assistant\",\"model\":\"claude-3-5-sonnet-20240620\",\"content\":[{\"type\":\"text\",\"text\":\"{\\n \\\"answer\\\": \\\"The current president of the United States is Joe Biden. He is the 46th president of the United States and took office in 2021. Joe Biden previously served as the 47th Vice President of the United States and represented Delaware in the US Senate for 36 years before becoming president.\\\"\\n}\"}],\"stop_reason\":\"end_turn\",\"stop_sequence\":null,\"usage\":{\"input_tokens\":181,\"output_tokens\":73}}" -} diff --git a/tests/Fixtures/Saloon/Integrations/ClaudeTestAgent-2384f5379c63d4a79106a90e25db0613.json b/tests/Fixtures/Saloon/Integrations/ClaudeTestAgent-2384f5379c63d4a79106a90e25db0613.json deleted file mode 100644 index 436d80a..0000000 --- a/tests/Fixtures/Saloon/Integrations/ClaudeTestAgent-2384f5379c63d4a79106a90e25db0613.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 08 Oct 2024 23:28:12 GMT", - "Content-Type": "application\/json", - "Content-Length": "408", - "Connection": "keep-alive" - }, - "data": "{\"id\":\"msg_01WYJG7akjyJXCsBfbxabZ9o\",\"type\":\"message\",\"role\":\"assistant\",\"model\":\"claude-3-5-sonnet-20240620\",\"content\":[{\"type\":\"text\",\"text\":\"```json\\n{\\n \\\"answer\\\": \\\"The current president of the United States is Joe Biden. He is serving as the 46th president of the United States since 2021.\\\"\\n}\\n```\"}],\"stop_reason\":\"end_turn\",\"stop_sequence\":null,\"usage\":{\"input_tokens\":1440,\"output_tokens\":46}}" -} diff --git a/tests/Fixtures/Saloon/Integrations/ClaudeTestAgent-9e4ad814794b1055d28d99c79ff01b37.json b/tests/Fixtures/Saloon/Integrations/ClaudeTestAgent-9e4ad814794b1055d28d99c79ff01b37.json deleted file mode 100644 index 65ba85b..0000000 --- a/tests/Fixtures/Saloon/Integrations/ClaudeTestAgent-9e4ad814794b1055d28d99c79ff01b37.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Thu, 03 Oct 2024 17:21:04 GMT", - "Content-Type": "application\/json", - "Content-Length": "523", - "Connection": "keep-alive" - }, - "data": "{\"id\":\"msg_01BCmUueKuM5LNUnyVsYvVaE\",\"type\":\"message\",\"role\":\"assistant\",\"model\":\"claude-3-5-sonnet-20240620\",\"content\":[{\"type\":\"text\",\"text\":\"Certainly! I'll use the Google search tool to find information about the current president of the United States for you.\"},{\"type\":\"tool_use\",\"id\":\"toolu_019TcpRFgSYNTm48xupzaqH1\",\"name\":\"serper_tool\",\"input\":{\"query\":\"current president of the United States\",\"searchType\":\"search\"}}],\"stop_reason\":\"tool_use\",\"stop_sequence\":null,\"usage\":{\"input_tokens\":517,\"output_tokens\":101}}" -} diff --git a/tests/Fixtures/Saloon/Integrations/ClaudeTestAgent-Serper-Tool.json b/tests/Fixtures/Saloon/Integrations/ClaudeTestAgent-Serper-Tool.json index 7576b1b..1e1218a 100644 --- a/tests/Fixtures/Saloon/Integrations/ClaudeTestAgent-Serper-Tool.json +++ b/tests/Fixtures/Saloon/Integrations/ClaudeTestAgent-Serper-Tool.json @@ -1,11 +1,10 @@ { - "statusCode": 200, - "headers": { - "access-control-allow-origin": "*", - "x-ratelimit-limit": "500", - "x-ratelimit-remaining": "499", - "x-ratelimit-reset": "1725375100", - "content-type": "application/json; charset=utf-8" - }, - "data": "{\"searchParameters\":{\"q\":\"current President of the United States\",\"type\":\"search\",\"num\":10,\"engine\":\"google\"},\"answerBox\":{\"title\":\"United States / President\",\"answer\":\"Joe Biden\"},\"organic\":[{\"title\":\"President of the United States - Wikipedia\",\"link\":\"https://en.wikipedia.org/wiki/President_of_the_United_States\",\"snippet\":\"The president of the United States (POTUS) is the head of state and head of government of the United States of America. The president directs the executive ...\",\"position\":1},{\"title\":\"Joe Biden: The President | The White House\",\"link\":\"https://www.whitehouse.gov/administration/president-biden/\",\"snippet\":\"President Biden represented Delaware for 36 years in the US Senate before becoming the 47th Vice President of the United States.\",\"position\":2},{\"title\":\"Presidents, vice presidents, and first ladies | USAGov\",\"link\":\"https://www.usa.gov/presidents\",\"snippet\":\"Learn about the duties of the U.S. president, vice president, and first lady. Find out how to contact and learn more about current and past ...\",\"date\":\"Dec 6, 2023\",\"position\":3},{\"title\":\"President of the United States\",\"link\":\"https://usun.usmission.gov/our-leaders/the-president-of-the-united-states/\",\"snippet\":\"President Biden represented Delaware for 36 years in the US Senate before becoming the 47th Vice President of the United States.\",\"position\":4},{\"title\":\"The Executive Branch | The White House\",\"link\":\"https://www.whitehouse.gov/about-the-white-house/our-government/the-executive-branch/\",\"snippet\":\"From the President, to the Vice President, to the Cabinet, learn more about the Executive Branch of the government of the United States.\",\"position\":5},{\"title\":\"President Joe Biden (@potus) \u2022 Instagram profile\",\"link\":\"https://www.instagram.com/potus/?hl=en\",\"snippet\":\"19M Followers, 5 Following, 4282 Posts - President Joe Biden (@potus) on Instagram: \\\"46th President of the United States, husband to @flotus, proud dad and ...\",\"position\":6},{\"title\":\"President Joe Biden - Facebook\",\"link\":\"https://www.facebook.com/POTUS/\",\"snippet\":\"President Joe Biden. 10344211 likes \u00b7 287600 talking about this. 46th President of the United States, husband to @FLOTUS, proud father and pop. Text...\",\"position\":7},{\"title\":\"Joe Biden - Wikipedia\",\"link\":\"https://en.wikipedia.org/wiki/Joe_Biden\",\"snippet\":\"Joseph Robinette Biden Jr. (born November 20, 1942) is an American politician serving as the 46th and current president of the United States since 2021.\",\"sitelinks\":[{\"title\":\"Political positions\",\"link\":\"https://en.wikipedia.org/wiki/Political_positions_of_Joe_Biden\"},{\"title\":\"Electoral history\",\"link\":\"https://en.wikipedia.org/wiki/Electoral_history_of_Joe_Biden\"},{\"title\":\"United States House Oversight\",\"link\":\"https://en.wikipedia.org/wiki/United_States_House_Oversight_Committee_investigation_into_the_Biden_family\"},{\"title\":\"Jill Biden\",\"link\":\"https://en.wikipedia.org/wiki/Jill_Biden\"}],\"position\":8},{\"title\":\"Joe Biden's Path to the United States Presidency | Britannica\",\"link\":\"https://www.britannica.com/video/226766/who-is-President-Joe-Biden\",\"snippet\":\"Learn more about the life and career of Joe Biden, the 46th president of the United States.\",\"date\":\"Jan 7, 2022\",\"attributes\":{\"Duration\":\"2:21\",\"Posted\":\"Jan 7, 2022\"},\"imageUrl\":\"https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcTy2z3ONNaR5BsVyaVUp_PIfgjZYBB-erXUwbbLCz-1jox2T8j1i9A6FA0\",\"position\":9},{\"title\":\"Joe Biden | Biography, Family, Policies, & Facts - Britannica\",\"link\":\"https://www.britannica.com/biography/Joe-Biden\",\"snippet\":\"Joe Biden, the 46th president of the United States, brings decades of political experience and a commitment to unity as he leads America through challenging ...\",\"position\":10}],\"peopleAlsoAsk\":[{\"question\":\"Who is the number 1 US president?\",\"snippet\":\"Abraham Lincoln has taken the highest ranking in each survey and George Washington, Franklin D. Roosevelt, and Theodore Roosevelt have always ranked in the top five while James Buchanan, Andrew Johnson, and Franklin Pierce have been ranked at the bottom of all four surveys.\",\"title\":\"Historical rankings of presidents of the United States - Wikipedia\",\"link\":\"https://en.wikipedia.org/wiki/Historical_rankings_of_presidents_of_the_United_States\"},{\"question\":\"Who is next in line for President of us?\",\"snippet\":\"No.\\nOffice\\nParty\\n1\\nVice President\\nDemocratic\\n2\\nSpeaker of the House of Representatives\\nRepublican\\n3\\nPresident pro tempore of the Senate\\nDemocratic\\n4\\nSecretary of State\\nDemocratic\",\"title\":\"United States presidential line of succession - Wikipedia\",\"link\":\"https://en.wikipedia.org/wiki/United_States_presidential_line_of_succession\"},{\"question\":\"Who is the Vice President of the United States today?\",\"snippet\":\"Kamala D. Harris is the Vice President of the United States of America.\",\"title\":\"Vice President of the United States\",\"link\":\"https://ec.usembassy.gov/our-relationship/vice-president/\"},{\"question\":\"Who was the youngest President of the US?\",\"snippet\":\"The median age at inauguration of incoming U.S. presidents is 55 years. The youngest person to become U.S. president was Theodore Roosevelt, who, at age 42, succeeded to the office after the assassination of William McKinley.\",\"title\":\"List of presidents of the United States by age - Wikipedia\",\"link\":\"https://en.wikipedia.org/wiki/List_of_presidents_of_the_United_States_by_age\"}],\"relatedSearches\":[{\"query\":\"Who is the Vice President of the United States\"},{\"query\":\"Who is the 46th president\"},{\"query\":\"All Presidents in order\"},{\"query\":\"48th president of the United States\"},{\"query\":\"Who is the New President of the United States\"},{\"query\":\"First president of USA\"},{\"query\":\"Joe Biden age\"},{\"query\":\"Who is the Prime Minister of USA\"}],\"credits\":1}" + "statusCode": 200, + "headers": { + "access-control-allow-origin": "*", + "x-ratelimit-limit": "500", + "x-ratelimit-remaining": "499", + "x-ratelimit-reset": "1729895750" + }, + "data": "{\"searchParameters\":{\"q\":\"current president of the United States\",\"type\":\"search\",\"num\":10,\"engine\":\"google\"},\"answerBox\":{\"title\":\"United States \/ President\",\"answer\":\"Joe Biden\"},\"organic\":[{\"title\":\"Joe Biden: The President | The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/administration\/president-biden\/\",\"snippet\":\"President Biden represented Delaware for 36 years in the US Senate before becoming the 47th Vice President of the United States.\",\"position\":1},{\"title\":\"President of the United States - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/President_of_the_United_States\",\"snippet\":\"The president of the United States (POTUS) is the head of state and head of government of the United States of America. The president directs the executive ...\",\"sitelinks\":[{\"title\":\"American Presidents\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/List_of_presidents_of_the_United_States\"},{\"title\":\"Powers of the president\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Powers_of_the_president_of_the_United_States\"},{\"title\":\"Executive Office\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Executive_Office_of_the_President_of_the_United_States\"},{\"title\":\"Talk\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/President_of_the_United_States_(disambiguation)\"}],\"position\":2},{\"title\":\"President of the United States\",\"link\":\"https:\/\/usun.usmission.gov\/our-leaders\/the-president-of-the-united-states\/\",\"snippet\":\"President Biden represented Delaware for 36 years in the US Senate before becoming the 47th Vice President of the United States.\",\"position\":3},{\"title\":\"President Joe Biden (@potus) \u2022 Instagram photos and videos\",\"link\":\"https:\/\/www.instagram.com\/potus\/?hl=en\",\"snippet\":\"19M Followers, 5 Following, 4491 Posts - President Joe Biden (@potus) on Instagram: \\\"46th President of the United States, husband to @flotus ...\",\"date\":\"2 days ago\",\"position\":4},{\"title\":\"Presidents, vice presidents, and first ladies | USAGov\",\"link\":\"https:\/\/www.usa.gov\/presidents\",\"snippet\":\"Learn about the duties of the U.S. president, vice president, and first lady. Find out how to contact and learn more about current and past ...\",\"date\":\"Sep 20, 2024\",\"position\":5},{\"title\":\"The Executive Branch | The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/about-the-white-house\/our-government\/the-executive-branch\/\",\"snippet\":\"From the President, to the Vice President, to the Cabinet, learn more about the Executive Branch of the government of the United States.\",\"position\":6},{\"title\":\"Joe Biden - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Joe_Biden\",\"snippet\":\"Joseph Robinette Biden Jr. (born November 20, 1942) is an American politician who has been the 46th and current president of the United States since 2021.\",\"position\":7},{\"title\":\"Joe Biden's Path to the United States Presidency | Britannica\",\"link\":\"https:\/\/www.britannica.com\/video\/who-is-President-Joe-Biden\/-261012\",\"snippet\":\"Learn more about the life and career of Joe Biden, the 46th president of the United States.\",\"date\":\"Jan 7, 2022\",\"attributes\":{\"Duration\":\"2:21\",\"Posted\":\"Jan 7, 2022\"},\"position\":8},{\"title\":\"President of the United States - Ballotpedia\",\"link\":\"https:\/\/ballotpedia.org\/President_of_the_United_States\",\"snippet\":\"Article II of the U.S. Constitution laid out the requirements and roles of the president. The current president is Joe Biden (D). Election requirements.\",\"position\":9},{\"title\":\"Joe Biden | Biography, Family, Policies, & Facts | Britannica\",\"link\":\"https:\/\/www.britannica.com\/biography\/Joe-Biden\",\"snippet\":\"Joe Biden, the 46th president of the United States, brings decades of political experience and a commitment to unity as he leads America ...\",\"date\":\"Oct 7, 2024\",\"position\":10}],\"peopleAlsoAsk\":[{\"question\":\"Who is the new president of the United States?\",\"snippet\":\"As President, Biden will restore America's leadership and build our communities back better.\",\"title\":\"Joe Biden: The President | The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/administration\/president-biden\/\"},{\"question\":\"Who was the youngest president of the USA?\",\"snippet\":\"The median age at inauguration of incoming U.S. presidents is 55 years. The youngest person to become U.S. president was Theodore Roosevelt, who, at age 42, succeeded to the office after the assassination of William McKinley.\",\"title\":\"List of presidents of the United States by age - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/List_of_presidents_of_the_United_States_by_age\"},{\"question\":\"Who is number 1 president?\",\"snippet\":\"Abraham Lincoln has taken the highest ranking in each survey and George Washington, Franklin D. Roosevelt, and Theodore Roosevelt have always ranked in the top five while James Buchanan, Andrew Johnson, and Franklin Pierce have been ranked at the bottom of all four surveys.\",\"title\":\"Historical rankings of presidents of the United States - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Historical_rankings_of_presidents_of_the_United_States\"},{\"question\":\"Who was the 47th vice president?\",\"snippet\":\"Joseph Robinette Biden, Jr., represented Delaware for 36 years in the U.S. Senate before becoming the 47th and current Vice President of the United States.\",\"title\":\"Vice President Joe Biden | The White House\",\"link\":\"https:\/\/obamawhitehouse.archives.gov\/vp\"}],\"relatedSearches\":[{\"query\":\"Who is the Vice President of the United States\"},{\"query\":\"Who is the 46th president\"},{\"query\":\"47th President of the United States\"},{\"query\":\"48th President of the United States\"},{\"query\":\"All Presidents in order\"},{\"query\":\"Who is the New President of the United States\"},{\"query\":\"Joe Biden age\"},{\"query\":\"Is Joe Biden still president\"}],\"credits\":1}" } diff --git a/tests/Fixtures/Saloon/Integrations/ClaudeTestAgent-f53d2674b3ae26af9917b35b24751e4e.json b/tests/Fixtures/Saloon/Integrations/ClaudeTestAgent-f53d2674b3ae26af9917b35b24751e4e.json deleted file mode 100644 index 498615f..0000000 --- a/tests/Fixtures/Saloon/Integrations/ClaudeTestAgent-f53d2674b3ae26af9917b35b24751e4e.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Thu, 03 Oct 2024 17:21:06 GMT", - "Content-Type": "application/json", - "Content-Length": "685", - "Connection": "keep-alive" - }, - "data": "{\"id\":\"msg_01QXkWJFEt4ovqFcChsaTsf2\",\"type\":\"message\",\"role\":\"assistant\",\"model\":\"claude-3-5-sonnet-20240620\",\"content\":[{\"type\":\"text\",\"text\":\"Based on the search results, I can provide you with the answer about the current president of the United States.\\n\\n```json\\n{\\n \\\"answer\\\": \\\"The current president of the United States is Joe Biden. He is the 46th president of the United States and took office in 2021. Joe Biden previously served as the 47th Vice President of the United States and represented Delaware in the US Senate for 36 years before becoming president.\\\"\\n}\\n```\"}],\"stop_reason\":\"end_turn\",\"stop_sequence\":null,\"usage\":{\"input_tokens\":1367,\"output_tokens\":102}}" -} diff --git a/tests/Fixtures/Saloon/Integrations/ClaudeTestAgent.json b/tests/Fixtures/Saloon/Integrations/ClaudeTestAgent.json index b571f73..5dac74a 100644 --- a/tests/Fixtures/Saloon/Integrations/ClaudeTestAgent.json +++ b/tests/Fixtures/Saloon/Integrations/ClaudeTestAgent.json @@ -1,16 +1,10 @@ { "statusCode": 200, "headers": { - "Date": "Wed, 04 Sep 2024 13:34:55 GMT", + "Date": "Fri, 25 Oct 2024 22:35:46 GMT", "Content-Type": "application/json", - "Content-Length": "315", - "Connection": "keep-alive", - "anthropic-ratelimit-requests-limit": "50", - "anthropic-ratelimit-requests-remaining": "49", - "anthropic-ratelimit-requests-reset": "2024-09-04T13:35:21Z", - "anthropic-ratelimit-tokens-limit": "40000", - "anthropic-ratelimit-tokens-remaining": "40000", - "anthropic-ratelimit-tokens-reset": "2024-09-04T13:34:55Z" + "Content-Length": "302", + "Connection": "keep-alive" }, - "data": "{\"id\":\"msg_01Uxhp67wAnDLJVgH9rKc7mX\",\"type\":\"message\",\"role\":\"assistant\",\"model\":\"claude-3-5-sonnet-20240620\",\"content\":[{\"type\":\"text\",\"text\":\"```json\\n{\\n \\\"answer\\\": \\\"Hello! How can I assist you today?\\\"\\n}\\n```\"}],\"stop_reason\":\"end_turn\",\"stop_sequence\":null,\"usage\":{\"input_tokens\":56,\"output_tokens\":26}}" + "data": "{\"id\":\"msg_01LmxHhUUB5iGNX8hd7CHQdm\",\"type\":\"message\",\"role\":\"assistant\",\"model\":\"claude-3-5-sonnet-20240620\",\"content\":[{\"type\":\"text\",\"text\":\"{\\n \\\"answer\\\": \\\"Hello! How can I assist you today?\\\"\\n}\"}],\"stop_reason\":\"end_turn\",\"stop_sequence\":null,\"usage\":{\"input_tokens\":102,\"output_tokens\":21}}" } diff --git a/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-0700e950a65562155bd8920325b51181.json b/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-0700e950a65562155bd8920325b51181.json new file mode 100644 index 0000000..f72d102 --- /dev/null +++ b/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-0700e950a65562155bd8920325b51181.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Fri, 25 Oct 2024 22:35:52 GMT", + "Content-Type": "application/json", + "Content-Length": "693", + "Connection": "keep-alive" + }, + "data": "{\"id\":\"msg_01U46oa7ef3riiRKkdj7tYHS\",\"type\":\"message\",\"role\":\"assistant\",\"model\":\"claude-3-5-sonnet-20240620\",\"content\":[{\"type\":\"text\",\"text\":\"Based on the search results, I can provide you with the information about the current president of the United States.\\n\\n```json\\n{\\n \\\"answer\\\": \\\"The current president of the United States is Joe Biden. He is the 46th president of the United States, having taken office in 2021. Biden previously served as the 47th Vice President of the United States and represented Delaware in the U.S. Senate for 36 years before becoming president.\\\"\\n}\\n```\"}],\"stop_reason\":\"end_turn\",\"stop_sequence\":null,\"usage\":{\"input_tokens\":1634,\"output_tokens\":105}}" +} diff --git a/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-652ecfbf9539e59a6fd65d11f1a2fba2.json b/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-652ecfbf9539e59a6fd65d11f1a2fba2.json deleted file mode 100644 index c5e3d87..0000000 --- a/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-652ecfbf9539e59a6fd65d11f1a2fba2.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:10:34 GMT", - "Content-Type": "application\/json", - "Content-Length": "554", - "Connection": "keep-alive" - }, - "data": "{\"id\":\"msg_01UhGwrG9YgACCgLu48F2tx8\",\"type\":\"message\",\"role\":\"assistant\",\"model\":\"claude-3-5-sonnet-20240620\",\"content\":[{\"type\":\"text\",\"text\":\"{\\n \\\"answer\\\": \\\"The current president of the United States is Joe Biden. He is the 46th president of the United States and took office in 2021. Joe Biden previously served as the 47th Vice President of the United States and represented Delaware in the US Senate for 36 years before becoming president.\\\"\\n}\"}],\"stop_reason\":\"end_turn\",\"stop_sequence\":null,\"usage\":{\"input_tokens\":1610,\"output_tokens\":73}}" -} diff --git a/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-74cc9ac7d39fc2dbb068a35c3b4154a8.json b/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-74cc9ac7d39fc2dbb068a35c3b4154a8.json new file mode 100644 index 0000000..00f8819 --- /dev/null +++ b/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-74cc9ac7d39fc2dbb068a35c3b4154a8.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Fri, 25 Oct 2024 22:35:54 GMT", + "Content-Type": "application\/json", + "Content-Length": "557", + "Connection": "keep-alive" + }, + "data": "{\"id\":\"msg_01V8MMPaJ5dns4C1KavzLoXq\",\"type\":\"message\",\"role\":\"assistant\",\"model\":\"claude-3-5-sonnet-20240620\",\"content\":[{\"type\":\"text\",\"text\":\"{\\n \\\"answer\\\": \\\"The current president of the United States is Joe Biden. He is the 46th president of the United States, having taken office in 2021. Biden previously served as the 47th Vice President of the United States and represented Delaware in the U.S. Senate for 36 years before becoming president.\\\"\\n}\"}],\"stop_reason\":\"end_turn\",\"stop_sequence\":null,\"usage\":{\"input_tokens\":1834,\"output_tokens\":76}}" +} diff --git a/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-9ae29f2ff260a200c78e895234990b88.json b/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-9ae29f2ff260a200c78e895234990b88.json deleted file mode 100644 index 7d8a3dd..0000000 --- a/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-9ae29f2ff260a200c78e895234990b88.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Thu, 24 Oct 2024 01:33:41 GMT", - "Content-Type": "application\/json", - "Content-Length": "515", - "Connection": "keep-alive" - }, - "data": "{\"id\":\"msg_016sUkaDosKYyTYiwnDqJq6v\",\"type\":\"message\",\"role\":\"assistant\",\"model\":\"claude-3-5-sonnet-20240620\",\"content\":[{\"type\":\"text\",\"text\":\"{\\n \\\"answer\\\": \\\"The current president of the United States is Joe Biden. He is the 46th president, having taken office in 2021. Biden previously served as the 47th Vice President and represented Delaware in the U.S. Senate for 36 years before becoming president.\\\"\\n}\"}],\"stop_reason\":\"end_turn\",\"stop_sequence\":null,\"usage\":{\"input_tokens\":1847,\"output_tokens\":68}}" -} diff --git a/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-9e4ad814794b1055d28d99c79ff01b37.json b/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-9e4ad814794b1055d28d99c79ff01b37.json index e048e02..7fb8c64 100644 --- a/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-9e4ad814794b1055d28d99c79ff01b37.json +++ b/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-9e4ad814794b1055d28d99c79ff01b37.json @@ -1,10 +1,10 @@ { - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:10:30 GMT", - "Content-Type": "application/json", - "Content-Length": "557", - "Connection": "keep-alive" - }, - "data": "{\"id\":\"msg_01Eq8LoF24ttPcPdZCx5FVzq\",\"type\":\"message\",\"role\":\"assistant\",\"model\":\"claude-3-5-sonnet-20240620\",\"content\":[{\"type\":\"text\",\"text\":\"To search Google for information about the current president of the United States, I'll use the serper_tool function. Here's how I'll structure the query:\"},{\"type\":\"tool_use\",\"id\":\"toolu_01AZWBaBr57C7x92FbW8GxuX\",\"name\":\"serper_tool\",\"input\":{\"query\":\"current president of the United States\",\"searchType\":\"search\"}}],\"stop_reason\":\"tool_use\",\"stop_sequence\":null,\"usage\":{\"input_tokens\":554,\"output_tokens\":111}}" + "statusCode": 200, + "headers": { + "Date": "Fri, 25 Oct 2024 22:35:49 GMT", + "Content-Type": "application\/json", + "Content-Length": "523", + "Connection": "keep-alive" + }, + "data": "{\"id\":\"msg_01C2qd8JZoxH5moRkypwc8cT\",\"type\":\"message\",\"role\":\"assistant\",\"model\":\"claude-3-5-sonnet-20240620\",\"content\":[{\"type\":\"text\",\"text\":\"Certainly! I'll use the Google search tool to find information about the current president of the United States for you.\"},{\"type\":\"tool_use\",\"id\":\"toolu_01Ao9PHvVowGeBp41eFnNxHo\",\"name\":\"serper_tool\",\"input\":{\"query\":\"current president of the United States\",\"searchType\":\"search\"}}],\"stop_reason\":\"tool_use\",\"stop_sequence\":null,\"usage\":{\"input_tokens\":554,\"output_tokens\":102}}" } diff --git a/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-c31fbf2a429a96687e99c3b94fd406f3.json b/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-c31fbf2a429a96687e99c3b94fd406f3.json deleted file mode 100644 index 8a15af2..0000000 --- a/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-c31fbf2a429a96687e99c3b94fd406f3.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Thu, 24 Oct 2024 01:33:40 GMT", - "Content-Type": "application\/json", - "Content-Length": "688" - }, - "data": "{\"id\":\"msg_01Rf1cmavyQXHwrTKuRBDpwt\",\"type\":\"message\",\"role\":\"assistant\",\"model\":\"claude-3-5-sonnet-20240620\",\"content\":[{\"type\":\"text\",\"text\":\"Based on the search results, I can provide you with the information about the current president of the United States:\\n\\n```json\\n{\\n \\\"answer\\\": \\\"The current president of the United States is Joe Biden. He is the 46th and current president, having taken office in 2021. Joe Biden previously served as the 47th Vice President of the United States and represented Delaware in the U.S. Senate for 36 years before becoming president.\\\"\\n}\\n```\"}],\"stop_reason\":\"end_turn\",\"stop_sequence\":null,\"usage\":{\"input_tokens\":1648,\"output_tokens\":104}}" -} diff --git a/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-e6ed7a42ff9b7106aa22db121275e575.json b/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-e6ed7a42ff9b7106aa22db121275e575.json deleted file mode 100644 index 6131849..0000000 --- a/tests/Fixtures/Saloon/Integrations/ClaudeToolTestAgent-e6ed7a42ff9b7106aa22db121275e575.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:10:32 GMT", - "Content-Type": "application\/json", - "Content-Length": "690", - "Connection": "keep-alive" - }, - "data": "{\"id\":\"msg_01BmxjB7URqBjdHs994ijozw\",\"type\":\"message\",\"role\":\"assistant\",\"model\":\"claude-3-5-sonnet-20240620\",\"content\":[{\"type\":\"text\",\"text\":\"Based on the search results, I can provide you with the information about the current president of the United States.\\n\\n```json\\n{\\n \\\"answer\\\": \\\"The current president of the United States is Joe Biden. He is the 46th president of the United States and took office in 2021. Joe Biden previously served as the 47th Vice President of the United States and represented Delaware in the US Senate for 36 years before becoming president.\\\"\\n}\\n```\"}],\"stop_reason\":\"end_turn\",\"stop_sequence\":null,\"usage\":{\"input_tokens\":1413,\"output_tokens\":102}}" -} diff --git a/tests/Fixtures/Saloon/Integrations/OllamaTestAgent-Serper-Tool.json b/tests/Fixtures/Saloon/Integrations/OllamaTestAgent-Serper-Tool.json index 3d1b7bf..24b0157 100644 --- a/tests/Fixtures/Saloon/Integrations/OllamaTestAgent-Serper-Tool.json +++ b/tests/Fixtures/Saloon/Integrations/OllamaTestAgent-Serper-Tool.json @@ -4,15 +4,15 @@ "access-control-allow-origin": "*", "x-ratelimit-limit": "500", "x-ratelimit-remaining": "499", - "x-ratelimit-reset": "1729559610", + "x-ratelimit-reset": "1729895590", "content-type": "application\/json; charset=utf-8", - "x-cloud-trace-context": "3306ea4ecb0fdb4d634a34089f9366bc", - "set-cookie": "GAESA=CowBMDA3OTg5ZjJhMTUxNDY0YzcyYTk1Mjg4MzA4N2QwNGUwNjgwZjVhNWI3OWI3YmEyNmU2NjAyZGQzMDMxZDI5Yzg0NzNmOWUyZDY0YzJjMzQ0MTI2ODNjOGNiN2QyZmJlNTllZGEzZTRjYjU5MGI2NGFmYzg2NmQxMGMwODFiYmM2MzhhYjE1YmJiMDUQhISljqsy; expires=Thu, 21-Nov-2024 01:13:29 GMT; path=\/", - "date": "Tue, 22 Oct 2024 01:13:29 GMT", + "x-cloud-trace-context": "35a8df804c3e269c3c7b2bd134fb4039", + "set-cookie": "GAESA=Co4BMDA0OTQwYjNiODMxZTc0NDA2YmU2MThjNDg0NDhkY2JkOGVjZTI2OTQ2M2VhZmY2NDBmN2NlMGRmODdlMWI0MTg5MmE2MDYzYzIxZTI4NDIzMmU4MWJlNjdmNzVhYTZhZDYyMGVjNTYyYmM1N2QzNjQ0YmQxMThhZDM3OTkxZGEyNmIzZGJhNmQ3Mzc4NhCWt7-urDI; expires=Sun, 24-Nov-2024 22:33:06 GMT; path=\/", + "date": "Fri, 25 Oct 2024 22:33:06 GMT", "server": "Google Frontend", - "Content-Length": "5698", + "Content-Length": "5250", "via": "1.1 google", "Alt-Svc": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" }, - "data": "{\"searchParameters\":{\"q\":\"current president of the united states\",\"type\":\"search\",\"num\":10,\"engine\":\"google\"},\"organic\":[{\"title\":\"Joe Biden: The President | The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/administration\/president-biden\/\",\"snippet\":\"President Biden represented Delaware for 36 years in the US Senate before becoming the 47th Vice President of the United States.\",\"position\":1},{\"title\":\"President of the United States - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/President_of_the_United_States\",\"snippet\":\"The president of the United States (POTUS) is the head of state and head of government of the United States of America. The president directs the executive ...\",\"sitelinks\":[{\"title\":\"American Presidents\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/List_of_presidents_of_the_United_States\"},{\"title\":\"Powers of the president\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Powers_of_the_president_of_the_United_States\"},{\"title\":\"Executive Office of the\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Executive_Office_of_the_President_of_the_United_States\"},{\"title\":\"Talk\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/President_of_the_United_States_(disambiguation)\"}],\"position\":2},{\"title\":\"President of the United States\",\"link\":\"https:\/\/usun.usmission.gov\/our-leaders\/the-president-of-the-united-states\/\",\"snippet\":\"President Biden represented Delaware for 36 years in the US Senate before becoming the 47th Vice President of the United States.\",\"position\":3},{\"title\":\"President Joe Biden (@potus) \u2022 Instagram photos and videos\",\"link\":\"https:\/\/www.instagram.com\/potus\/?hl=en\",\"snippet\":\"19M Followers, 5 Following, 4480 Posts - President Joe Biden (@potus) on Instagram: \\\"46th President of the United States, husband to @flotus, proud dad and ...\",\"position\":4},{\"title\":\"Presidents, vice presidents, and first ladies | USAGov\",\"link\":\"https:\/\/www.usa.gov\/presidents\",\"snippet\":\"Learn about the duties of the U.S. president, vice president, and first lady. Find out how to contact and learn more about current and past ...\",\"date\":\"Sep 20, 2024\",\"position\":5},{\"title\":\"The Executive Branch | The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/about-the-white-house\/our-government\/the-executive-branch\/\",\"snippet\":\"From the President, to the Vice President, to the Cabinet, learn more about the Executive Branch of the government of the United States.\",\"position\":6},{\"title\":\"Joe Biden - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Joe_Biden\",\"snippet\":\"Joseph Robinette Biden Jr. (born November 20, 1942) is an American politician who has been the 46th and current president of the United States since 2021.\",\"position\":7},{\"title\":\"President Joe Biden - Facebook\",\"link\":\"https:\/\/www.facebook.com\/POTUS\/\",\"snippet\":\"President Joe Biden. 10328420 likes \u00b7 100413 talking about this. 46th President of the United States, husband to @FLOTUS, proud father and pop. Text...\",\"sitelinks\":[{\"title\":\"Photos\",\"link\":\"https:\/\/m.facebook.com\/POTUS\/photos\/\"},{\"title\":\"Followers\",\"link\":\"https:\/\/m.facebook.com\/POTUS\/followers\/\"},{\"title\":\"Iniciar sesi\u00f3n\",\"link\":\"https:\/\/www.facebook.com\/POTUS\/?locale=es_LA\"},{\"title\":\"\u8a73\u7d30\u8cc7\u6599\",\"link\":\"https:\/\/m.facebook.com\/POTUS\/?locale=zh_TW\"}],\"position\":8},{\"title\":\"Joe Biden's Path to the United States Presidency | Britannica\",\"link\":\"https:\/\/www.britannica.com\/video\/who-is-President-Joe-Biden\/-261012\",\"snippet\":\"Learn more about the life and career of Joe Biden, the 46th president of the United States.\",\"date\":\"Jan 7, 2022\",\"attributes\":{\"Duration\":\"2:21\",\"Posted\":\"Jan 7, 2022\"},\"position\":9},{\"title\":\"President Joe Biden | CNN Politics\",\"link\":\"https:\/\/www.cnn.com\/politics\/joe-biden\",\"snippet\":\"CNN coverage of Joseph R. Biden, the 46th president of the United States \u00b7 Latest Headlines \u00b7 Latest Video \u00b7 Spotlight \u00b7 Vice President Kamala Harris \u00b7 More News.\",\"position\":10}],\"peopleAlsoAsk\":[{\"question\":\"Who is the new president of the United States?\",\"snippet\":\"President Biden graduated from the University of Delaware and Syracuse Law School and served on the New Castle County Council. At age 29, President Biden became one of the youngest Americans ever elected to the United States Senate.\",\"title\":\"Joe Biden: The President | The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/administration\/president-biden\/\"},{\"question\":\"Who was the youngest president of the USA?\",\"snippet\":\"The median age at inauguration of incoming U.S. presidents is 55 years. The youngest person to become U.S. president was Theodore Roosevelt, who, at age 42, succeeded to the office after the assassination of William McKinley.\",\"title\":\"List of presidents of the United States by age - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/List_of_presidents_of_the_United_States_by_age\"},{\"question\":\"Who is the 50th president?\",\"snippet\":\"Joseph R. Biden Jr.\",\"title\":\"Presidents | The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/about-the-white-house\/presidents\/\"},{\"question\":\"Who is number 1 president?\",\"snippet\":\"On April 30, 1789, George Washington, standing on the balcony of Federal Hall on Wall Street in New York, took his oath of office as the first President of the United States.\",\"title\":\"George Washington | The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/about-the-white-house\/presidents\/george-washington\/\"}],\"relatedSearches\":[{\"query\":\"Who is the current Vice President of the United States\"},{\"query\":\"Who is the 46th president\"},{\"query\":\"Who is the New President of the United States\"},{\"query\":\"Who is the 47th President of the United States\"},{\"query\":\"All Presidents in order\"},{\"query\":\"Joe Biden age\"},{\"query\":\"48th President of the United States\"},{\"query\":\"Is Joe Biden still president\"}],\"credits\":1}" + "data": "{\"searchParameters\":{\"q\":\"the current president of the united states.\",\"type\":\"search\",\"num\":10,\"engine\":\"google\"},\"organic\":[{\"title\":\"Joe Biden: The President | The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/administration\/president-biden\/\",\"snippet\":\"President Biden represented Delaware for 36 years in the US Senate before becoming the 47th Vice President of the United States.\",\"position\":1},{\"title\":\"President of the United States - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/President_of_the_United_States\",\"snippet\":\"The president of the United States (POTUS) is the head of state and head of government of the United States of America. The president directs the executive ...\",\"sitelinks\":[{\"title\":\"American Presidents\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/List_of_presidents_of_the_United_States\"},{\"title\":\"Powers of the president\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Powers_of_the_president_of_the_United_States\"},{\"title\":\"Executive Office\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Executive_Office_of_the_President_of_the_United_States\"},{\"title\":\"Talk\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/President_of_the_United_States_(disambiguation)\"}],\"position\":2},{\"title\":\"President of the United States\",\"link\":\"https:\/\/usun.usmission.gov\/our-leaders\/the-president-of-the-united-states\/\",\"snippet\":\"President Biden represented Delaware for 36 years in the US Senate before becoming the 47th Vice President of the United States.\",\"position\":3},{\"title\":\"President Joe Biden (@potus) \u2022 Instagram photos and videos\",\"link\":\"https:\/\/www.instagram.com\/potus\/?hl=en\",\"snippet\":\"19M Followers, 5 Following, 4491 Posts - President Joe Biden (@potus) on Instagram: \\\"46th President of the United States, husband to @flotus ...\",\"date\":\"2 days ago\",\"position\":4},{\"title\":\"Presidents, vice presidents, and first ladies | USAGov\",\"link\":\"https:\/\/www.usa.gov\/presidents\",\"snippet\":\"Learn about the duties of the U.S. president, vice president, and first lady. Find out how to contact and learn more about current and past ...\",\"date\":\"Sep 20, 2024\",\"position\":5},{\"title\":\"The Executive Branch | The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/about-the-white-house\/our-government\/the-executive-branch\/\",\"snippet\":\"From the President, to the Vice President, to the Cabinet, learn more about the Executive Branch of the government of the United States.\",\"position\":6},{\"title\":\"Joe Biden - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Joe_Biden\",\"snippet\":\"Joseph Robinette Biden Jr. (born November 20, 1942) is an American politician who has been the 46th and current president of the United States since 2021.\",\"position\":7},{\"title\":\"Joe Biden's Path to the United States Presidency | Britannica\",\"link\":\"https:\/\/www.britannica.com\/video\/who-is-President-Joe-Biden\/-261012\",\"snippet\":\"Learn more about the life and career of Joe Biden, the 46th president of the United States.\",\"date\":\"Jan 7, 2022\",\"attributes\":{\"Duration\":\"2:21\",\"Posted\":\"Jan 7, 2022\"},\"position\":8},{\"title\":\"President of the United States - Ballotpedia\",\"link\":\"https:\/\/ballotpedia.org\/President_of_the_United_States\",\"snippet\":\"Article II of the U.S. Constitution laid out the requirements and roles of the president. The current president is Joe Biden (D). Election requirements.\",\"position\":9},{\"title\":\"President of the United States - U.S. Embassy & Consulates in India\",\"link\":\"https:\/\/in.usembassy.gov\/our-relationship\/the-president-of-the-united-states\/\",\"snippet\":\"President Biden represented Delaware for 36 years in the US Senate before becoming the 47th Vice President of the United States.\",\"position\":10}],\"peopleAlsoAsk\":[{\"question\":\"Who is the new president in American?\",\"snippet\":\"In all, 45 individuals have served 46 presidencies spanning 58 four-year terms. Joe Biden is the 46th and current president, having assumed office on January 20, 2021.\",\"title\":\"President of the United States - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/President_of_the_United_States\"},{\"question\":\"Who is the #1 president?\",\"snippet\":\"On April 30, 1789, George Washington, standing on the balcony of Federal Hall on Wall Street in New York, took his oath of office as the first President of the United States.\",\"title\":\"George Washington | The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/about-the-white-house\/presidents\/george-washington\/\"},{\"question\":\"Who is the USA president?\",\"snippet\":\"Joe Biden\\nJoe Biden: The President. The White House.\",\"title\":\"Joe Biden: The President | The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/administration\/president-biden\/\"},{\"question\":\"Is Joe Biden still president?\",\"snippet\":\"Joseph Robinette Biden Jr. (born November 20, 1942) is an American politician who has been the 46th and current president of the United States since 2021.\",\"title\":\"Joe Biden - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Joe_Biden\"}],\"relatedSearches\":[{\"query\":\"Who is the Vice President of the United States\"},{\"query\":\"Who is the 46th president\"},{\"query\":\"Who is the New President of the United States\"},{\"query\":\"48th President of the United States\"},{\"query\":\"u.s. president list\"},{\"query\":\"47th President of the United States\"},{\"query\":\"Joe Biden age\"},{\"query\":\"Is Kamala Harris President\"}],\"credits\":1}" } \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Integrations/OllamaTestAgent-d8f986e1f1fc626f7d0d10b0fd2ba58f.json b/tests/Fixtures/Saloon/Integrations/OllamaTestAgent-d8f986e1f1fc626f7d0d10b0fd2ba58f.json index b5935b5..3702e70 100644 --- a/tests/Fixtures/Saloon/Integrations/OllamaTestAgent-d8f986e1f1fc626f7d0d10b0fd2ba58f.json +++ b/tests/Fixtures/Saloon/Integrations/OllamaTestAgent-d8f986e1f1fc626f7d0d10b0fd2ba58f.json @@ -2,8 +2,8 @@ "statusCode": 200, "headers": { "Content-Type": "application\/json; charset=utf-8", - "Date": "Tue, 22 Oct 2024 01:12:45 GMT", - "Content-Length": "330" + "Date": "Fri, 25 Oct 2024 22:32:43 GMT", + "Content-Length": "331" }, - "data": "{\"model\":\"llama3.2\",\"created_at\":\"2024-10-22T01:12:45.859244298Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\n \\\"answer\\\": \\\"Hello!\\\" }\\n```\"},\"done_reason\":\"stop\",\"done\":true,\"total_duration\":2645440997,\"load_duration\":20609427,\"prompt_eval_count\":111,\"prompt_eval_duration\":1796052000,\"eval_count\":11,\"eval_duration\":704477000}" + "data": "{\"model\":\"llama3.2\",\"created_at\":\"2024-10-25T22:32:43.781790706Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\n \\\"answer\\\": \\\"Hi there!\\\"\\n}\"},\"done_reason\":\"stop\",\"done\":true,\"total_duration\":5583213110,\"load_duration\":2327188911,\"prompt_eval_count\":111,\"prompt_eval_duration\":2533807000,\"eval_count\":11,\"eval_duration\":680305000}" } \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Integrations/OllamaToolTestAgent-73a9b9db662176ac0a3ed17dec715886.json b/tests/Fixtures/Saloon/Integrations/OllamaToolTestAgent-73a9b9db662176ac0a3ed17dec715886.json deleted file mode 100644 index 6aa8e64..0000000 --- a/tests/Fixtures/Saloon/Integrations/OllamaToolTestAgent-73a9b9db662176ac0a3ed17dec715886.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Content-Type": "application\/json; charset=utf-8", - "Date": "Tue, 22 Oct 2024 01:13:52 GMT", - "Content-Length": "391" - }, - "data": "{\"model\":\"llama3.2\",\"created_at\":\"2024-10-22T01:13:52.227941545Z\",\"message\":{\"role\":\"assistant\",\"content\":\"```\\n{\\n \\\"answer\\\": \\\"The current President of the United States is Joe Biden.\\\"\\n}\\n```\"},\"done_reason\":\"stop\",\"done\":true,\"total_duration\":22040210143,\"load_duration\":20179864,\"prompt_eval_count\":855,\"prompt_eval_duration\":20239842000,\"eval_count\":22,\"eval_duration\":1568235000}" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Integrations/OllamaToolTestAgent-c0527b86cfc080fa4aaa3255dd06edfc.json b/tests/Fixtures/Saloon/Integrations/OllamaToolTestAgent-c0527b86cfc080fa4aaa3255dd06edfc.json index 7514713..5e22d51 100644 --- a/tests/Fixtures/Saloon/Integrations/OllamaToolTestAgent-c0527b86cfc080fa4aaa3255dd06edfc.json +++ b/tests/Fixtures/Saloon/Integrations/OllamaToolTestAgent-c0527b86cfc080fa4aaa3255dd06edfc.json @@ -1,9 +1,9 @@ { - "statusCode": 200, - "headers": { - "Content-Type": "application/json; charset=utf-8", - "Date": "Tue, 22 Oct 2024 01:13:28 GMT", - "Content-Length": "456" - }, - "data": "{\"model\":\"llama3.2\",\"created_at\":\"2024-10-22T01:13:28.947376961Z\",\"message\":{\"role\":\"assistant\",\"content\":\"\",\"tool_calls\":[{\"function\":{\"name\":\"serper_tool\",\"arguments\":{\"numberOfResults\":\"10\",\"query\":\"current president of the united states\",\"searchType\":\"search\"}}}]},\"done_reason\":\"stop\",\"done\":true,\"total_duration\":9544760508,\"load_duration\":19568592,\"prompt_eval_count\":325,\"prompt_eval_duration\":7393902000,\"eval_count\":29,\"eval_duration\":2007733000}" -} + "statusCode": 200, + "headers": { + "Content-Type": "application\/json; charset=utf-8", + "Date": "Fri, 25 Oct 2024 22:32:53 GMT", + "Content-Length": "461" + }, + "data": "{\"model\":\"llama3.2\",\"created_at\":\"2024-10-25T22:32:53.341652928Z\",\"message\":{\"role\":\"assistant\",\"content\":\"\",\"tool_calls\":[{\"function\":{\"name\":\"serper_tool\",\"arguments\":{\"numberOfResults\":\"10\",\"query\":\"the current president of the united states.\",\"searchType\":\"search\"}}}]},\"done_reason\":\"stop\",\"done\":true,\"total_duration\":9449725558,\"load_duration\":15762599,\"prompt_eval_count\":325,\"prompt_eval_duration\":7271351000,\"eval_count\":30,\"eval_duration\":2037525000}" +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Integrations/OllamaToolTestAgent-dd3c1226bcfb52db4cac0fc3cd00f4f0.json b/tests/Fixtures/Saloon/Integrations/OllamaToolTestAgent-dd3c1226bcfb52db4cac0fc3cd00f4f0.json deleted file mode 100644 index 7de4de3..0000000 --- a/tests/Fixtures/Saloon/Integrations/OllamaToolTestAgent-dd3c1226bcfb52db4cac0fc3cd00f4f0.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Content-Type": "application\/json; charset=utf-8", - "Date": "Thu, 24 Oct 2024 01:34:12 GMT", - "Content-Length": "376" - }, - "data": "{\"model\":\"llama3.2\",\"created_at\":\"2024-10-24T01:34:12.828517139Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\\"answer\\\": \\\"Joe Biden is the current President of the United States.\\\"}\"},\"done_reason\":\"stop\",\"done\":true,\"total_duration\":30057119000,\"load_duration\":2077610548,\"prompt_eval_count\":1061,\"prompt_eval_duration\":26605401000,\"eval_count\":17,\"eval_duration\":1199741000}" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Integrations/OllamaToolTestAgent-f1744f93cad29395237a8874e3527b0d.json b/tests/Fixtures/Saloon/Integrations/OllamaToolTestAgent-f1744f93cad29395237a8874e3527b0d.json new file mode 100644 index 0000000..9c9c00d --- /dev/null +++ b/tests/Fixtures/Saloon/Integrations/OllamaToolTestAgent-f1744f93cad29395237a8874e3527b0d.json @@ -0,0 +1,9 @@ +{ + "statusCode": 200, + "headers": { + "Content-Type": "application\/json; charset=utf-8", + "Date": "Fri, 25 Oct 2024 22:33:32 GMT", + "Content-Length": "373" + }, + "data": "{\"model\":\"llama3.2\",\"created_at\":\"2024-10-25T22:33:32.714183387Z\",\"message\":{\"role\":\"assistant\",\"content\":\"{\\\"answer\\\":\\\"Joe Biden is the current president of the United States.\\\"}\"},\"done_reason\":\"stop\",\"done\":true,\"total_duration\":25843897079,\"load_duration\":21748238,\"prompt_eval_count\":1036,\"prompt_eval_duration\":24480786000,\"eval_count\":16,\"eval_duration\":1123629000}" +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Integrations/OpenAiTestAgent.json b/tests/Fixtures/Saloon/Integrations/OpenAiTestAgent.json index 29bdd4e..4995096 100644 --- a/tests/Fixtures/Saloon/Integrations/OpenAiTestAgent.json +++ b/tests/Fixtures/Saloon/Integrations/OpenAiTestAgent.json @@ -1,10 +1,27 @@ { "statusCode": 200, "headers": { - "Date": "Tue, 22 Oct 2024 01:14:46 GMT", + "Date": "Fri, 25 Oct 2024 22:29:57 GMT", "Content-Type": "application/json", "Content-Length": "655", - "Connection": "keep-alive" + "Connection": "keep-alive", + "access-control-expose-headers": "X-Request-ID", + "openai-organization": "REDACTED", + "openai-processing-ms": "440", + "openai-version": "2020-10-01", + "x-ratelimit-limit-requests": "10000", + "x-ratelimit-limit-tokens": "2000000", + "x-ratelimit-remaining-requests": "9999", + "x-ratelimit-remaining-tokens": "1999879", + "x-ratelimit-reset-requests": "6ms", + "x-ratelimit-reset-tokens": "3ms", + "x-request-id": "REDACTED", + "strict-transport-security": "max-age=31536000; includeSubDomains; preload", + "CF-Cache-Status": "DYNAMIC", + "X-Content-Type-Options": "nosniff", + "Server": "cloudflare", + "CF-RAY": "REDACTED", + "alt-svc": "h3=\":443\"; ma=86400" }, - "data": "{\n \"id\": \"chatcmpl-AKxltPt5yDOlBBJmGR7TAth1NH7bS\",\n \"object\": \"chat.completion\",\n \"created\": 1729559685,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"answer\\\": \\\"Hello!\\\"\\n}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 96,\n \"completion_tokens\": 9,\n \"total_tokens\": 105,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" + "data": "{\n \"id\": \"chatcmpl-AMN6bR6Xy3bGwGT4fZppmiTROIaSz\",\n \"object\": \"chat.completion\",\n \"created\": 1729895397,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"answer\\\": \\\"Hello!\\\"\\n}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 96,\n \"completion_tokens\": 9,\n \"total_tokens\": 105,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_ed14c08274\"\n}\n" } diff --git a/tests/Fixtures/Saloon/Integrations/OpenAiToolTestAgent-4715cf69359c579bd0b0aaebdb3cfe92.json b/tests/Fixtures/Saloon/Integrations/OpenAiToolTestAgent-4715cf69359c579bd0b0aaebdb3cfe92.json new file mode 100644 index 0000000..78d644a --- /dev/null +++ b/tests/Fixtures/Saloon/Integrations/OpenAiToolTestAgent-4715cf69359c579bd0b0aaebdb3cfe92.json @@ -0,0 +1,27 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Fri, 25 Oct 2024 22:27:22 GMT", + "Content-Type": "application\/json", + "Content-Length": "676", + "Connection": "keep-alive", + "access-control-expose-headers": "X-Request-ID", + "openai-organization": "REDACTED", + "openai-processing-ms": "758", + "openai-version": "2020-10-01", + "x-ratelimit-limit-requests": "10000", + "x-ratelimit-limit-tokens": "2000000", + "x-ratelimit-remaining-requests": "9999", + "x-ratelimit-remaining-tokens": "1998980", + "x-ratelimit-reset-requests": "6ms", + "x-ratelimit-reset-tokens": "30ms", + "x-request-id": "REDACTED", + "strict-transport-security": "max-age=31536000; includeSubDomains; preload", + "CF-Cache-Status": "DYNAMIC", + "X-Content-Type-Options": "nosniff", + "Server": "cloudflare", + "CF-RAY": "REDACTED", + "alt-svc": "h3=\":443\"; ma=86400" + }, + "data": "{\n \"id\": \"chatcmpl-AMN46XDLyBLBkffKn7kulT68HGqvo\",\n \"object\": \"chat.completion\",\n \"created\": 1729895242,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Joe Biden\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1140,\n \"completion_tokens\": 15,\n \"total_tokens\": 1155,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_ed14c08274\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Integrations/OpenAiToolTestAgent-75c161b01e340522e8715d4c26443fa9.json b/tests/Fixtures/Saloon/Integrations/OpenAiToolTestAgent-75c161b01e340522e8715d4c26443fa9.json deleted file mode 100644 index 51d7285..0000000 --- a/tests/Fixtures/Saloon/Integrations/OpenAiToolTestAgent-75c161b01e340522e8715d4c26443fa9.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Thu, 24 Oct 2024 01:34:14 GMT", - "Content-Type": "application\/json", - "Content-Length": "676", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-ALh1qLnFxQ7etMVx5Urpmd4TCuMTH\",\n \"object\": \"chat.completion\",\n \"created\": 1729733654,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Joe Biden\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1119,\n \"completion_tokens\": 15,\n \"total_tokens\": 1134,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_ed14c08274\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Integrations/OpenAiToolTestAgent-8c4de06e2a7064e26c30dd1131e7c149.json b/tests/Fixtures/Saloon/Integrations/OpenAiToolTestAgent-8c4de06e2a7064e26c30dd1131e7c149.json index 44ec98b..f2eb12b 100644 --- a/tests/Fixtures/Saloon/Integrations/OpenAiToolTestAgent-8c4de06e2a7064e26c30dd1131e7c149.json +++ b/tests/Fixtures/Saloon/Integrations/OpenAiToolTestAgent-8c4de06e2a7064e26c30dd1131e7c149.json @@ -1,10 +1,27 @@ { "statusCode": 200, "headers": { - "Date": "Tue, 22 Oct 2024 01:14:47 GMT", + "Date": "Fri, 25 Oct 2024 22:27:21 GMT", "Content-Type": "application\/json", - "Content-Length": "985", - "Connection": "keep-alive" + "Content-Length": "984", + "Connection": "keep-alive", + "access-control-expose-headers": "X-Request-ID", + "openai-organization": "REDACTED", + "openai-processing-ms": "1191", + "openai-version": "2020-10-01", + "x-ratelimit-limit-requests": "10000", + "x-ratelimit-limit-tokens": "2000000", + "x-ratelimit-remaining-requests": "9999", + "x-ratelimit-remaining-tokens": "1999865", + "x-ratelimit-reset-requests": "6ms", + "x-ratelimit-reset-tokens": "4ms", + "x-request-id": "REDACTED", + "strict-transport-security": "max-age=31536000; includeSubDomains; preload", + "CF-Cache-Status": "DYNAMIC", + "X-Content-Type-Options": "nosniff", + "Server": "cloudflare", + "CF-RAY": "REDACTED", + "alt-svc": "h3=\":443\"; ma=86400" }, - "data": "{\n \"id\": \"chatcmpl-AKxluvQCEThkm2qOIuQGOzO4ije0d\",\n \"object\": \"chat.completion\",\n \"created\": 1729559686,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_mL9H73EAkD9uUEPZLbDITNRK\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"serper_tool\",\n \"arguments\": \"{\\\"query\\\":\\\"current president of the United States\\\",\\\"searchType\\\":\\\"search\\\",\\\"numberOfResults\\\":10}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 213,\n \"completion_tokens\": 30,\n \"total_tokens\": 243,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" + "data": "{\n \"id\": \"chatcmpl-AMN44jCGNROnJSVGGCuPuos6eLyoe\",\n \"object\": \"chat.completion\",\n \"created\": 1729895240,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_I0yDdVlYb6QX0TeS3OPfpwDJ\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"serper_tool\",\n \"arguments\": \"{\\\"query\\\":\\\"current president of the United States\\\",\\\"searchType\\\":\\\"search\\\",\\\"numberOfResults\\\":1}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 213,\n \"completion_tokens\": 30,\n \"total_tokens\": 243,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_ed14c08274\"\n}\n" } diff --git a/tests/Fixtures/Saloon/Integrations/OpenAiToolTestAgent-Serper-Tool.json b/tests/Fixtures/Saloon/Integrations/OpenAiToolTestAgent-Serper-Tool.json index 87afe41..de0f4ba 100644 --- a/tests/Fixtures/Saloon/Integrations/OpenAiToolTestAgent-Serper-Tool.json +++ b/tests/Fixtures/Saloon/Integrations/OpenAiToolTestAgent-Serper-Tool.json @@ -4,7 +4,13 @@ "access-control-allow-origin": "*", "x-ratelimit-limit": "500", "x-ratelimit-remaining": "499", - "x-ratelimit-reset": "1729559690" + "x-ratelimit-reset": "1729894705", + "content-type": "application\/json; charset=utf-8", + "date": "Fri, 25 Oct 2024 22:18:23 GMT", + "server": "Google Frontend", + "Content-Length": "5687", + "via": "1.1 google", + "Alt-Svc": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" }, - "data": "{\"searchParameters\":{\"q\":\"current president of the United States\",\"type\":\"search\",\"num\":10,\"engine\":\"google\"},\"answerBox\":{\"title\":\"United States \/ President\",\"answer\":\"Joe Biden\"},\"organic\":[{\"title\":\"Joe Biden: The President | The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/administration\/president-biden\/\",\"snippet\":\"President Biden represented Delaware for 36 years in the US Senate before becoming the 47th Vice President of the United States.\",\"position\":1},{\"title\":\"President of the United States - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/President_of_the_United_States\",\"snippet\":\"The president of the United States (POTUS) is the head of state and head of government of the United States of America. The president directs the executive ...\",\"sitelinks\":[{\"title\":\"American Presidents\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/List_of_presidents_of_the_United_States\"},{\"title\":\"Powers of the president\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Powers_of_the_president_of_the_United_States\"},{\"title\":\"Executive Office of the\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Executive_Office_of_the_President_of_the_United_States\"},{\"title\":\"Talk\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/President_of_the_United_States_(disambiguation)\"}],\"position\":2},{\"title\":\"President of the United States\",\"link\":\"https:\/\/usun.usmission.gov\/our-leaders\/the-president-of-the-united-states\/\",\"snippet\":\"President Biden represented Delaware for 36 years in the US Senate before becoming the 47th Vice President of the United States.\",\"position\":3},{\"title\":\"President Joe Biden (@potus) \u2022 Instagram photos and videos\",\"link\":\"https:\/\/www.instagram.com\/potus\/?hl=en\",\"snippet\":\"19M Followers, 5 Following, 4480 Posts - President Joe Biden (@potus) on Instagram: \\\"46th President of the United States, husband to @flotus, proud dad and ...\",\"position\":4},{\"title\":\"Presidents, vice presidents, and first ladies | USAGov\",\"link\":\"https:\/\/www.usa.gov\/presidents\",\"snippet\":\"Learn about the duties of the U.S. president, vice president, and first lady. Find out how to contact and learn more about current and past ...\",\"date\":\"Sep 20, 2024\",\"position\":5},{\"title\":\"The Executive Branch | The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/about-the-white-house\/our-government\/the-executive-branch\/\",\"snippet\":\"From the President, to the Vice President, to the Cabinet, learn more about the Executive Branch of the government of the United States.\",\"position\":6},{\"title\":\"Joe Biden - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Joe_Biden\",\"snippet\":\"Joseph Robinette Biden Jr. (born November 20, 1942) is an American politician who has been the 46th and current president of the United States since 2021.\",\"position\":7},{\"title\":\"President Joe Biden - Facebook\",\"link\":\"https:\/\/www.facebook.com\/POTUS\/\",\"snippet\":\"President Joe Biden. 10328420 likes \u00b7 100413 talking about this. 46th President of the United States, husband to @FLOTUS, proud father and pop. Text...\",\"sitelinks\":[{\"title\":\"Photos\",\"link\":\"https:\/\/m.facebook.com\/POTUS\/photos\/\"},{\"title\":\"Followers\",\"link\":\"https:\/\/m.facebook.com\/POTUS\/followers\/\"},{\"title\":\"Iniciar sesi\u00f3n\",\"link\":\"https:\/\/www.facebook.com\/POTUS\/?locale=es_LA\"},{\"title\":\"\u8a73\u7d30\u8cc7\u6599\",\"link\":\"https:\/\/m.facebook.com\/POTUS\/?locale=zh_TW\"}],\"position\":8},{\"title\":\"Joe Biden's Path to the United States Presidency | Britannica\",\"link\":\"https:\/\/www.britannica.com\/video\/who-is-President-Joe-Biden\/-261012\",\"snippet\":\"Learn more about the life and career of Joe Biden, the 46th president of the United States.\",\"date\":\"Jan 7, 2022\",\"attributes\":{\"Duration\":\"2:21\",\"Posted\":\"Jan 7, 2022\"},\"position\":9},{\"title\":\"President Joe Biden | CNN Politics\",\"link\":\"https:\/\/www.cnn.com\/politics\/joe-biden\",\"snippet\":\"CNN coverage of Joseph R. Biden, the 46th president of the United States \u00b7 Latest Headlines \u00b7 Latest Video \u00b7 Spotlight \u00b7 Vice President Kamala Harris \u00b7 More News.\",\"position\":10}],\"peopleAlsoAsk\":[{\"question\":\"Who is the new president of the United States?\",\"snippet\":\"President Biden graduated from the University of Delaware and Syracuse Law School and served on the New Castle County Council. At age 29, President Biden became one of the youngest Americans ever elected to the United States Senate.\",\"title\":\"Joe Biden: The President | The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/administration\/president-biden\/\"},{\"question\":\"Who was the youngest president of the USA?\",\"snippet\":\"The median age at inauguration of incoming U.S. presidents is 55 years. The youngest person to become U.S. president was Theodore Roosevelt, who, at age 42, succeeded to the office after the assassination of William McKinley.\",\"title\":\"List of presidents of the United States by age - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/List_of_presidents_of_the_United_States_by_age\"},{\"question\":\"Who is the 50th president?\",\"snippet\":\"Joseph R. Biden Jr.\",\"title\":\"Presidents | The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/about-the-white-house\/presidents\/\"},{\"question\":\"Who is number 1 president?\",\"snippet\":\"On April 30, 1789, George Washington, standing on the balcony of Federal Hall on Wall Street in New York, took his oath of office as the first President of the United States.\",\"title\":\"George Washington | The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/about-the-white-house\/presidents\/george-washington\/\"}],\"relatedSearches\":[{\"query\":\"Who is the Vice President of the United States\"},{\"query\":\"Who is the 46th president\"},{\"query\":\"47th President of the United States\"},{\"query\":\"48th President of the United States\"},{\"query\":\"All Presidents in order\"},{\"query\":\"Who is the New President of the United States\"},{\"query\":\"Joe Biden age\"},{\"query\":\"Is Kamala Harris President\"}],\"credits\":1}" + "data": "{\"searchParameters\":{\"q\":\"current president of the United States\",\"type\":\"search\",\"num\":10,\"engine\":\"google\"},\"answerBox\":{\"title\":\"United States \/ President\",\"answer\":\"Joe Biden\"},\"organic\":[{\"title\":\"Joe Biden: The President | The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/administration\/president-biden\/\",\"snippet\":\"President Biden represented Delaware for 36 years in the US Senate before becoming the 47th Vice President of the United States.\",\"position\":1},{\"title\":\"President of the United States - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/President_of_the_United_States\",\"snippet\":\"The president of the United States (POTUS) is the head of state and head of government of the United States of America. The president directs the executive ...\",\"sitelinks\":[{\"title\":\"American Presidents\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/List_of_presidents_of_the_United_States\"},{\"title\":\"Powers of the president\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Powers_of_the_president_of_the_United_States\"},{\"title\":\"Executive Office\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Executive_Office_of_the_President_of_the_United_States\"},{\"title\":\"Talk\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/President_of_the_United_States_(disambiguation)\"}],\"position\":2},{\"title\":\"President of the United States\",\"link\":\"https:\/\/usun.usmission.gov\/our-leaders\/the-president-of-the-united-states\/\",\"snippet\":\"President Biden represented Delaware for 36 years in the US Senate before becoming the 47th Vice President of the United States.\",\"position\":3},{\"title\":\"President Joe Biden (@potus) \u2022 Instagram photos and videos\",\"link\":\"https:\/\/www.instagram.com\/potus\/?hl=en\",\"snippet\":\"19M Followers, 5 Following, 4491 Posts - President Joe Biden (@potus) on Instagram: \\\"46th President of the United States, husband to @flotus ...\",\"date\":\"2 days ago\",\"position\":4},{\"title\":\"The Executive Branch | The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/about-the-white-house\/our-government\/the-executive-branch\/\",\"snippet\":\"From the President, to the Vice President, to the Cabinet, learn more about the Executive Branch of the government of the United States.\",\"position\":5},{\"title\":\"Presidents, vice presidents, and first ladies | USAGov\",\"link\":\"https:\/\/www.usa.gov\/presidents\",\"snippet\":\"Learn about the duties of the U.S. president, vice president, and first lady. Find out how to contact and learn more about current and past ...\",\"date\":\"Sep 20, 2024\",\"position\":6},{\"title\":\"Joe Biden - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Joe_Biden\",\"snippet\":\"Joseph Robinette Biden Jr. (born November 20, 1942) is an American politician who has been the 46th and current president of the United States since 2021.\",\"position\":7},{\"title\":\"Joe Biden's Path to the United States Presidency | Britannica\",\"link\":\"https:\/\/www.britannica.com\/video\/who-is-President-Joe-Biden\/-261012\",\"snippet\":\"Learn more about the life and career of Joe Biden, the 46th president of the United States.\",\"date\":\"Jan 7, 2022\",\"attributes\":{\"Duration\":\"2:21\",\"Posted\":\"Jan 7, 2022\"},\"position\":8},{\"title\":\"Presidents of the United States of America - Ohio Secretary of State\",\"link\":\"https:\/\/www.ohiosos.gov\/elections\/election-results-and-data\/historical-election-comparisons\/presidents-of-the-united-states-of-america\/\",\"snippet\":\"4,5 \u00b7 6,7 \u00b7 8,9 \u00b7 10 ; Thomas Jefferson \u00b7 James Madison \u00b7 James Monroe \u00b7 John Quincy Adams.\",\"position\":9},{\"title\":\"Joe Biden | Biography, Family, Policies, & Facts | Britannica\",\"link\":\"https:\/\/www.britannica.com\/biography\/Joe-Biden\",\"snippet\":\"Joe Biden, the 46th president of the United States, brings decades of political experience and a commitment to unity as he leads America ...\",\"date\":\"Oct 7, 2024\",\"position\":10}],\"peopleAlsoAsk\":[{\"question\":\"Who is the new president of the United States?\",\"snippet\":\"As President, Biden will restore America's leadership and build our communities back better.\",\"title\":\"Joe Biden: The President | The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/administration\/president-biden\/\"},{\"question\":\"Who was the youngest president of the USA?\",\"snippet\":\"The median age at inauguration of incoming U.S. presidents is 55 years. The youngest person to become U.S. president was Theodore Roosevelt, who, at age 42, succeeded to the office after the assassination of William McKinley.\",\"title\":\"List of presidents of the United States by age - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/List_of_presidents_of_the_United_States_by_age\"},{\"question\":\"Who is number 1 president?\",\"snippet\":\"Abraham Lincoln has taken the highest ranking in each survey and George Washington, Franklin D. Roosevelt, and Theodore Roosevelt have always ranked in the top five while James Buchanan, Andrew Johnson, and Franklin Pierce have been ranked at the bottom of all four surveys.\",\"title\":\"Historical rankings of presidents of the United States - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Historical_rankings_of_presidents_of_the_United_States\"},{\"question\":\"Who was the 47th vice president?\",\"snippet\":\"Joseph Robinette Biden, Jr., represented Delaware for 36 years in the U.S. Senate before becoming the 47th and current Vice President of the United States.\",\"title\":\"Vice President Joe Biden | The White House\",\"link\":\"https:\/\/obamawhitehouse.archives.gov\/vp\"}],\"relatedSearches\":[{\"query\":\"Who is the Vice President of the United States\"},{\"query\":\"Who is the 46th president\"},{\"query\":\"47th President of the United States\"},{\"query\":\"All Presidents in order\"},{\"query\":\"48th President of the United States\"},{\"query\":\"Who is the New President of the United States\"},{\"query\":\"Joe Biden age\"},{\"query\":\"Is Joe Biden still president\"}],\"credits\":1}" } diff --git a/tests/Fixtures/Saloon/Integrations/OpenAiToolTestAgent-e0903793a2fa24d5a334f52b3d9b46c6.json b/tests/Fixtures/Saloon/Integrations/OpenAiToolTestAgent-e0903793a2fa24d5a334f52b3d9b46c6.json deleted file mode 100644 index bb86efc..0000000 --- a/tests/Fixtures/Saloon/Integrations/OpenAiToolTestAgent-e0903793a2fa24d5a334f52b3d9b46c6.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:14:50 GMT", - "Content-Type": "application\/json", - "Content-Length": "721", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AKxlxlegF2fwElaov1NEa1vOeMdEQ\",\n \"object\": \"chat.completion\",\n \"created\": 1729559689,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Joe Biden is the current President of the United States.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 913,\n \"completion_tokens\": 23,\n \"total_tokens\": 936,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Integrations/OpenAiWithOutResolveTestAgent.json b/tests/Fixtures/Saloon/Integrations/OpenAiWithOutResolveTestAgent.json index e4b03b7..74d89d8 100644 --- a/tests/Fixtures/Saloon/Integrations/OpenAiWithOutResolveTestAgent.json +++ b/tests/Fixtures/Saloon/Integrations/OpenAiWithOutResolveTestAgent.json @@ -1,12 +1,27 @@ { "statusCode": 200, "headers": { - "Date": "Tue, 22 Oct 2024 01:14:45 GMT", + "Date": "Fri, 25 Oct 2024 22:29:56 GMT", "Content-Type": "application/json", "Content-Length": "684", "Connection": "keep-alive", "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8" + "openai-organization": "REDACTED", + "openai-processing-ms": "570", + "openai-version": "2020-10-01", + "x-ratelimit-limit-requests": "10000", + "x-ratelimit-limit-tokens": "2000000", + "x-ratelimit-remaining-requests": "9999", + "x-ratelimit-remaining-tokens": "1999879", + "x-ratelimit-reset-requests": "6ms", + "x-ratelimit-reset-tokens": "3ms", + "x-request-id": "REDACTED", + "strict-transport-security": "max-age=31536000; includeSubDomains; preload", + "CF-Cache-Status": "DYNAMIC", + "X-Content-Type-Options": "nosniff", + "Server": "cloudflare", + "CF-RAY": "REDACTED", + "alt-svc": "h3=\":443\"; ma=86400" }, - "data": "{\n \"id\": \"chatcmpl-AKxlsdzTgy5RBFI4xFRDzYCEcntKy\",\n \"object\": \"chat.completion\",\n \"created\": 1729559684,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"answer\\\": \\\"Hello! How can I assist you today?\\\"\\n}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 96,\n \"completion_tokens\": 16,\n \"total_tokens\": 112,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" + "data": "{\n \"id\": \"chatcmpl-AMN6a0FJNXKBL5nMNo3j6S37bfTxz\",\n \"object\": \"chat.completion\",\n \"created\": 1729895396,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"answer\\\": \\\"Hello! How can I assist you today?\\\"\\n}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 96,\n \"completion_tokens\": 16,\n \"total_tokens\": 112,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_ed14c08274\"\n}\n" } diff --git a/tests/Fixtures/Saloon/Memory/CollectionMemory-71950ab35a36f639488c5a8c74463d53.json b/tests/Fixtures/Saloon/Memory/CollectionMemory-71950ab35a36f639488c5a8c74463d53.json deleted file mode 100644 index 98f2243..0000000 --- a/tests/Fixtures/Saloon/Memory/CollectionMemory-71950ab35a36f639488c5a8c74463d53.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Fri, 11 Oct 2024 22:28:20 GMT", - "Content-Type": "application/json", - "Content-Length": "686", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AHIPMZyJn0AjYpBALB0dLISFsiWlY\",\n \"object\": \"chat.completion\",\n \"created\": 1728685700,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"answer\\\": \\\".sdrawkcab tuB ?yas tsuj I did tahw\\\"\\n}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 111,\n \"completion_tokens\": 22,\n \"total_tokens\": 133,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Memory/CollectionMemory-8cefaea3e899f6f2489b3487aa0a040d.json b/tests/Fixtures/Saloon/Memory/CollectionMemory-8cefaea3e899f6f2489b3487aa0a040d.json deleted file mode 100644 index ae9194f..0000000 --- a/tests/Fixtures/Saloon/Memory/CollectionMemory-8cefaea3e899f6f2489b3487aa0a040d.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:28:47 GMT", - "Content-Type": "application\/json", - "Content-Length": "696", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "1121", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999839", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "4ms", - "x-request-id": "req_2b5930e81733c8b7f1ddee551e567a47", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=rtVTw0q1TFFEVwSOd7WpGh5vmMRpuP2cdZQrjmEFrtg-1729560527-1.0.1.1-hD81VqTDMu1.Add5pC4YMEGU_DtRPMXygLNCXlQ2E8BW5axUaIYkhoRCv9WVlJ4anVbvkcSdtpMI3a4EBehBPQ; path=\/; expires=Tue, 22-Oct-24 01:58:47 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=mRRdQJ9aHmYamqkONyzsd9b7.c265OWt3VzncynmLmw-1729560527465-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b668eb15c34b-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKxzSIWl0HaNUOKyw7yzEu9IDAzTn\",\n \"object\": \"chat.completion\",\n \"created\": 1729560526,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"?sdrawkcaB .yas tsuj I did tahw\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 150,\n \"completion_tokens\": 25,\n \"total_tokens\": 175,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Memory/CollectionMemory-d14909a03783ba5b88f3dea252a1f37a.json b/tests/Fixtures/Saloon/Memory/CollectionMemory-d14909a03783ba5b88f3dea252a1f37a.json deleted file mode 100644 index 361a3ed..0000000 --- a/tests/Fixtures/Saloon/Memory/CollectionMemory-d14909a03783ba5b88f3dea252a1f37a.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Fri, 11 Oct 2024 22:28:19 GMT", - "Content-Type": "application\/json", - "Content-Length": "683", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AHIPLTeiKo9T8X7gTB8e014CNDy21\",\n \"object\": \"chat.completion\",\n \"created\": 1728685699,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"answer\\\": \\\"Hello! How can I assist you today?\\\"\\n}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 71,\n \"completion_tokens\": 16,\n \"total_tokens\": 87,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Memory/CollectionMemory-fe703367aa1f98d7884652612a3c77a6.json b/tests/Fixtures/Saloon/Memory/CollectionMemory-fe703367aa1f98d7884652612a3c77a6.json deleted file mode 100644 index 39fa424..0000000 --- a/tests/Fixtures/Saloon/Memory/CollectionMemory-fe703367aa1f98d7884652612a3c77a6.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:28:45 GMT", - "Content-Type": "application\/json", - "Content-Length": "699", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "645", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999871", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "3ms", - "x-request-id": "req_d812e4f7e5835d70aed6a7319b731fdb", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=Ielj7HJ5UFyX1roQLJHPvepuIehAM00fGDBAtQ5wUVU-1729560525-1.0.1.1-.qJGpK6juks6BfzGmMMeSLlzfRDU63kCPVhOF5y7CacYYgbhGrLLGiyBaW7JC1Ea0Q9SCvgCfbx7t1Tw8V12ww; path=\/; expires=Tue, 22-Oct-24 01:58:45 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=hpAxlShffUqZT5swLIFFLD939cV0QQyKvtprK1dun0c-1729560525912-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b6622f7c41df-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKxzRHZJw0xhYEPqhXoMLP3CG36qC\",\n \"object\": \"chat.completion\",\n \"created\": 1729560525,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Hello! How can I assist you today?\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 106,\n \"completion_tokens\": 20,\n \"total_tokens\": 126,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-2f7d9367ae0a307240ca69cc079676ea.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-2f7d9367ae0a307240ca69cc079676ea.json deleted file mode 100644 index 8c89961..0000000 --- a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-2f7d9367ae0a307240ca69cc079676ea.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Fri, 11 Oct 2024 22:30:22 GMT", - "Content-Type": "application\/json", - "Content-Length": "698", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AHIRJgqcHGgn4tAM7wgZRz5qZHeI6\",\n \"object\": \"chat.completion\",\n \"created\": 1728685821,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Hello! How can I assist you today?\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 85,\n \"completion_tokens\": 20,\n \"total_tokens\": 105,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-5e1fafee7be3b90f42757e4e40abcea4.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-5e1fafee7be3b90f42757e4e40abcea4.json deleted file mode 100644 index 36ab5ff..0000000 --- a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-5e1fafee7be3b90f42757e4e40abcea4.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:28:48 GMT", - "Content-Type": "application\/json", - "Content-Length": "682", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "782", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999855", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "4ms", - "x-request-id": "req_c7812bf9445789a39c86210fbbb02ba2", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=vuy4vyIq7RR3thK2Hzr_6J1hGYcEVU_sOOMbQ94NTXg-1729560528-1.0.1.1-vXusK_QAoRJAlUc2d61BTJEv22ljCbPqGqZoBwxvNYoAaQph_P1KsD3_6Ax7tKQFFcHat7.bs4_JQ7w7uKfFPA; path=\/; expires=Tue, 22-Oct-24 01:58:48 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=YNNn.6fLfYYGc6dNguQNAetq7vf_sfGPlEG5d0haaiM-1729560528726-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b672eb6d0ca5-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKxzTjkbWKh9ao64cOPWDIRov1GFG\",\n \"object\": \"chat.completion\",\n \"created\": 1729560527,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"hello this a test\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 120,\n \"completion_tokens\": 16,\n \"total_tokens\": 136,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-6ca314ac196be36057a2a956836a6d8d.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-6ca314ac196be36057a2a956836a6d8d.json deleted file mode 100644 index cb3ccea..0000000 --- a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-6ca314ac196be36057a2a956836a6d8d.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:28:49 GMT", - "Content-Type": "application\/json", - "Content-Length": "724", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "881", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999894", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "3ms", - "x-request-id": "req_f83f9d9c34d6b164e361587b3194c7af", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=HtQfe9ZEiZRCCxBzOSUp6AaDT15vacOa0Jrght_B7WI-1729560529-1.0.1.1-9cn0ZEeutOeWovN1MNo4EYz_xlc3h9hGQ4ju.PEYGWEnXa.HMK7f5CauVgD2bx1uWkx1AchpRuQUITNTQruXrw; path=\/; expires=Tue, 22-Oct-24 01:58:49 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=x3it8V3bVr3kFFkcvhsJFqwaohKwUwxnzlqRKwrnX5c-1729560529986-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b67a2cd67c7c-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKxzVUNoLmGtlakUONmSyPFdxE77l\",\n \"object\": \"chat.completion\",\n \"created\": 1729560529,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"The user's message says \\\"hello this a test\\\" and the assistant responds with \\\"hello this a test\\\".\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 92,\n \"completion_tokens\": 22,\n \"total_tokens\": 114,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-6ebf9da45af10a1c751df604f61ca011.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-6ebf9da45af10a1c751df604f61ca011.json deleted file mode 100644 index f528038..0000000 --- a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-6ebf9da45af10a1c751df604f61ca011.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Fri, 11 Oct 2024 22:30:23 GMT", - "Content-Type": "application/json", - "Content-Length": "738", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AHIRKyjaJUQ8xw4cEq7zM6jMEXj4T\",\n \"object\": \"chat.completion\",\n \"created\": 1728685822,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"The user's message says \\\"hello this a test\\\". The assistant responded with \\\"Hello! How can I assist you today?\\\"\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 97,\n \"completion_tokens\": 25,\n \"total_tokens\": 122,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-88c99971ec0d20928a13254ec24d91e8.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-88c99971ec0d20928a13254ec24d91e8.json deleted file mode 100644 index 07e1751..0000000 --- a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-88c99971ec0d20928a13254ec24d91e8.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:37:06 GMT", - "Content-Type": "application/json", - "Content-Length": "685", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "771", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999823", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "5ms", - "x-request-id": "req_73a10708637cf068130b21f6669e743f", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=3fwN9kpVCyPDQJhUiCamWKqbcSsggIgxPiiZE.w7JZw-1729561026-1.0.1.1-NBAd0kJoT5QobhbxtZKuFzpzdRv1cW4YOKDmR7jvF4AMfwh8d544347KfZ5fDxdQ5Cguws6HgzSodoJbwnx7tQ; path=/; expires=Tue, 22-Oct-24 02:07:06 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=SKvmXa0uw5GlONqiHtr.U.b26KyZqKzyQvOSCzlTDcU-1729561026829-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65c29c0f3442b1-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKy7WsTDIkDUCG08tPr8OF7dz8gX6\",\n \"object\": \"chat.completion\",\n \"created\": 1729561026,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"tset a si siht olleh\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 149,\n \"completion_tokens\": 20,\n \"total_tokens\": 169,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-a5508037a2c8a381d8b9556e70d91322.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-a5508037a2c8a381d8b9556e70d91322.json deleted file mode 100644 index 32a0bea..0000000 --- a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-a5508037a2c8a381d8b9556e70d91322.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Fri, 11 Oct 2024 22:31:01 GMT", - "Content-Type": "application\/json", - "Content-Length": "858", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AHIRvpZKVwPc6IZqba591jmv5TDxj\",\n \"object\": \"chat.completion\",\n \"created\": 1728685859,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"The user's message says \\\"hello this a test\\\". The assistant responded with \\\"Hello! How can I assist you today?\\\" Following this, the user asked what they just said but backwards. The assistant replied with \\\"tset a si siht olleh\\\".\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 123,\n \"completion_tokens\": 52,\n \"total_tokens\": 175,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-bd12160cf0d4298d6b5dc4e13ae5a14d.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-bd12160cf0d4298d6b5dc4e13ae5a14d.json deleted file mode 100644 index ea54acd..0000000 --- a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-bd12160cf0d4298d6b5dc4e13ae5a14d.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:37:05 GMT", - "Content-Type": "application\/json", - "Content-Length": "779", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "1096", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999888", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "3ms", - "x-request-id": "req_021c6924d94bd0e3ee0f06bc3db4c4bc", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=vL__r5ubJvNV4RmlJZhNFqArDwX6GyxVKpi.q4yM0nI-1729561025-1.0.1.1-UpZdTgW2r55OFqoyho_c5ivHOoQRN8ljHmOPcECcUNlMcWmNp6zCSPvljzEVxxSgqJC6yW8kTDEo16cfyjxN8g; path=\/; expires=Tue, 22-Oct-24 02:07:05 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=8YjaCofLksiUzxQCu0C5XWrc1Q8tEXkO1xPJxxx0MkQ-1729561025666-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65c292d9c11a38-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKy7Uc6De3D1gSPOHQZTYrQkiA2Ek\",\n \"object\": \"chat.completion\",\n \"created\": 1729561024,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"The user's message says \\\"hello this a test\\\" and the assistant responds with \\\"hello this a test\\\". The user then asks what they just said, but backwards.\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 93,\n \"completion_tokens\": 34,\n \"total_tokens\": 127,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-ed9122f08b49da7ee73e6f97b414cde2.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-ed9122f08b49da7ee73e6f97b414cde2.json deleted file mode 100644 index 75765c3..0000000 --- a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-ed9122f08b49da7ee73e6f97b414cde2.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Fri, 11 Oct 2024 22:30:59 GMT", - "Content-Type": "application\/json", - "Content-Length": "685", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AHIRu92Y75hq2BYG0QOEX05ft6OhO\",\n \"object\": \"chat.completion\",\n \"created\": 1728685858,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"tset a si siht olleh\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 118,\n \"completion_tokens\": 20,\n \"total_tokens\": 138,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-efd20736544ba41f5fe46cb57dd7102e.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-efd20736544ba41f5fe46cb57dd7102e.json deleted file mode 100644 index 7eee38e..0000000 --- a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-efd20736544ba41f5fe46cb57dd7102e.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Fri, 11 Oct 2024 22:30:57 GMT", - "Content-Type": "application\/json", - "Content-Length": "804", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AHIRsh2BC8mD9NYcSUdOULmx0yEz8\",\n \"object\": \"chat.completion\",\n \"created\": 1728685856,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"The user's message says \\\"hello this a test\\\". The assistant responded with \\\"Hello! How can I assist you today?\\\" Following this, the user asked what they just said but backwards.\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 96,\n \"completion_tokens\": 38,\n \"total_tokens\": 134,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-f35bc9bf07dc805cedb1cbda219d7a63.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-f35bc9bf07dc805cedb1cbda219d7a63.json deleted file mode 100644 index 1143710..0000000 --- a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-f35bc9bf07dc805cedb1cbda219d7a63.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:37:08 GMT", - "Content-Type": "application\/json", - "Content-Length": "833", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "1472", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999867", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "3ms", - "x-request-id": "req_141298f6aa078e29d1afc0e0b3e13a4a", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=Xq_.3B8FFYh0icDGV9BMRsG1XRoKWpn4FR.vPbsrIqY-1729561028-1.0.1.1-CmRScxLczHkErR45.scYJkcdTj8L4HmoXsNAJYSH.p39nsm97GqsK.7PE3JBCZkVJPtVJmhK.9iv_Phn58kQnQ; path=\/; expires=Tue, 22-Oct-24 02:07:08 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=VQUYWMFih3MXgQW2g18Iiz7Cz5VtxZsT0Bn09DAcTzM-1729561028760-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65c2a3c9e17d02-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKy7X6AksadnNQ8O5xKbFuIWTJdz3\",\n \"object\": \"chat.completion\",\n \"created\": 1729561027,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"The user's message says \\\"hello this a test\\\" and the assistant responds with \\\"hello this a test\\\". The user then asks what they just said, but backwards. The assistant answers with \\\"tset a si siht olleh\\\".\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 119,\n \"completion_tokens\": 48,\n \"total_tokens\": 167,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-f36a2b79c2417f34329f24e826de8bce.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-f36a2b79c2417f34329f24e826de8bce.json deleted file mode 100644 index a197047..0000000 --- a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-f36a2b79c2417f34329f24e826de8bce.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Fri, 11 Oct 2024 22:30:20 GMT", - "Content-Type": "application\/json", - "Content-Length": "669", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AHIRICapumjPbPYCevujizmUX8tIB\",\n \"object\": \"chat.completion\",\n \"created\": 1728685820,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"The user's message says \\\"hello this a test\\\".\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 48,\n \"completion_tokens\": 11,\n \"total_tokens\": 59,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-36440b3fabab462e10a0388479c20807.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-36440b3fabab462e10a0388479c20807.json deleted file mode 100644 index d160882..0000000 --- a/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-36440b3fabab462e10a0388479c20807.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:41:40 GMT", - "Content-Type": "application\/json", - "Content-Length": "819", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AKyBvNyXTas4ANlvgTA60GGx5TYKp\",\n \"object\": \"chat.completion\",\n \"created\": 1729561299,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"The user wanted to know about the Vice President following the confirmation that Joe Biden is the current President of the United States. The Vice President following Joe Biden is Kamala Harris.\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 116,\n \"completion_tokens\": 35,\n \"total_tokens\": 151,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-47c33ba83a48790e1c7369c546e364d1.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-47c33ba83a48790e1c7369c546e364d1.json deleted file mode 100644 index c916253..0000000 --- a/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-47c33ba83a48790e1c7369c546e364d1.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:40:59 GMT", - "Content-Type": "application\/json", - "Content-Length": "721", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AKyBGdiiK67EBTKsg030yafl8AuPZ\",\n \"object\": \"chat.completion\",\n \"created\": 1729561258,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Joe Biden is the current President of the United States.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 951,\n \"completion_tokens\": 23,\n \"total_tokens\": 974,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-4dd943e799ab1c294682801edb307f4e.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-4dd943e799ab1c294682801edb307f4e.json deleted file mode 100644 index 059c141..0000000 --- a/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-4dd943e799ab1c294682801edb307f4e.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:40:55 GMT", - "Content-Type": "application\/json", - "Content-Length": "936", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AKyBCkD8mMFwheZaD8OYJ4wrwVkca\",\n \"object\": \"chat.completion\",\n \"created\": 1729561254,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_VgLPDzWdffoRI5faDGoGVHOV\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"serper_tool\",\n \"arguments\": \"{\\\"query\\\":\\\"current President of the United States\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 239,\n \"completion_tokens\": 20,\n \"total_tokens\": 259,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-840fbdc622785ce8eaf6265ec38b373a.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-840fbdc622785ce8eaf6265ec38b373a.json deleted file mode 100644 index 91c1f56..0000000 --- a/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-840fbdc622785ce8eaf6265ec38b373a.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:41:02 GMT", - "Content-Type": "application\/json", - "Content-Length": "978", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AKyBI2IiSzAG6L22hN0DGbHe3qaFO\",\n \"object\": \"chat.completion\",\n \"created\": 1729561260,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"The user requested to search Google for the current President of the United States. Using the serper_tool, the results showed multiple references confirming that Joe Biden is the current President of the United States, serving as the 46th president since 2021. The assistant confirmed that Joe Biden is indeed the current President of the United States.\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 139,\n \"completion_tokens\": 67,\n \"total_tokens\": 206,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-991e3ebf644dfe01a68fc39669e07299.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-991e3ebf644dfe01a68fc39669e07299.json deleted file mode 100644 index 5fabd19..0000000 --- a/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-991e3ebf644dfe01a68fc39669e07299.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:41:39 GMT", - "Content-Type": "application/json", - "Content-Length": "742", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AKyBuVmdBNnW5ohHS3bvE7exLroho\",\n \"object\": \"chat.completion\",\n \"created\": 1729561298,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"The Vice President of the United States following Joe Biden is Kamala Harris.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 243,\n \"completion_tokens\": 27,\n \"total_tokens\": 270,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-Tool-37a6259cc0c1dae299a7866489dff0bd.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-Tool-37a6259cc0c1dae299a7866489dff0bd.json deleted file mode 100644 index 5e48a06..0000000 --- a/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-Tool-37a6259cc0c1dae299a7866489dff0bd.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "access-control-allow-origin": "*", - "x-ratelimit-limit": "500", - "x-ratelimit-remaining": "499", - "x-ratelimit-reset": "1728686085" - }, - "data": "{\"searchParameters\":{\"q\":\"current president of the united states\",\"type\":\"search\",\"num\":10,\"engine\":\"google\"},\"answerBox\":{\"title\":\"Joe BidenUnited States \/ President\",\"answer\":\"Joe Biden\"},\"organic\":[{\"title\":\"President of the United States - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/President_of_the_United_States\",\"snippet\":\"The president of the United States (POTUS) is the head of state and head of government of the United States of America. The president directs the executive ...\",\"sitelinks\":[{\"title\":\"American Presidents\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/List_of_presidents_of_the_United_States\"},{\"title\":\"Powers of the president\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Powers_of_the_president_of_the_United_States\"},{\"title\":\"Executive Office\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Executive_Office_of_the_President_of_the_United_States\"},{\"title\":\"Talk\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/President_of_the_United_States_(disambiguation)\"}],\"position\":1},{\"title\":\"Joe Biden: The President | The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/administration\/president-biden\/\",\"snippet\":\"President Biden represented Delaware for 36 years in the US Senate before becoming the 47th Vice President of the United States.\",\"position\":2},{\"title\":\"President of the United States\",\"link\":\"https:\/\/usun.usmission.gov\/our-leaders\/the-president-of-the-united-states\/\",\"snippet\":\"President Biden represented Delaware for 36 years in the US Senate before becoming the 47th Vice President of the United States.\",\"position\":3},{\"title\":\"President Joe Biden (@potus) \u2022 Instagram photos and videos\",\"link\":\"https:\/\/www.instagram.com\/potus\/?hl=en\",\"snippet\":\"19M Followers, 5 Following, 4442 Posts - President Joe Biden (@potus) on Instagram: \\\"46th President of the United States, husband to @flotus, proud dad and ...\",\"position\":4},{\"title\":\"Presidents, vice presidents, and first ladies | USAGov\",\"link\":\"https:\/\/www.usa.gov\/presidents\",\"snippet\":\"Learn about the duties of president, vice president, and first lady of the United States. Find out how to contact and learn more about current and past leaders.\",\"position\":5},{\"title\":\"President Joe Biden - Facebook\",\"link\":\"https:\/\/www.facebook.com\/POTUS\/\",\"snippet\":\"The only way forward is to replace every lead pipeline in our country and connect the American people to clean water once and for all.\",\"position\":6},{\"title\":\"The Executive Branch | The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/about-the-white-house\/our-government\/the-executive-branch\/\",\"snippet\":\"From the President, to the Vice President, to the Cabinet, learn more about the Executive Branch of the government of the United States.\",\"position\":7},{\"title\":\"Joe Biden - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Joe_Biden\",\"snippet\":\"Joseph Robinette Biden Jr. (born November 20, 1942) is an American politician who has been the 46th and current president of the United States since 2021.\",\"sitelinks\":[{\"title\":\"Political positions\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Political_positions_of_Joe_Biden\"},{\"title\":\"Electoral history\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Electoral_history_of_Joe_Biden\"},{\"title\":\"2008 Presidential Campaign\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Joe_Biden_2008_presidential_campaign\"},{\"title\":\"Class president\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Class_president\"}],\"position\":8},{\"title\":\"Joe Biden's Path to the United States Presidency | Britannica\",\"link\":\"https:\/\/www.britannica.com\/video\/who-is-President-Joe-Biden\/-261012\",\"snippet\":\"Learn more about the life and career of Joe Biden, the 46th president of the United States.\",\"position\":9},{\"title\":\"President of the United States - Ballotpedia\",\"link\":\"https:\/\/ballotpedia.org\/President_of_the_United_States\",\"snippet\":\"Article II of the U.S. Constitution laid out the requirements and roles of the president. The current president is Joe Biden (D). Election requirements.\",\"position\":10}],\"peopleAlsoAsk\":[{\"question\":\"Who is the current president of the USA?\",\"snippet\":\"Joe Biden\\nUnited States \/ President\",\"title\":\"\"},{\"question\":\"What number president is Joe Biden?\",\"snippet\":\"46\\nJoe Biden \/ President number\",\"title\":\"\"},{\"question\":\"Who was the youngest president of the US?\",\"snippet\":\"The median age at inauguration of incoming U.S. presidents is 55 years. The youngest person to become U.S. president was Theodore Roosevelt, who, at age 42, succeeded to the office after the assassination of William McKinley.\",\"title\":\"List of presidents of the United States by age - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/List_of_presidents_of_the_United_States_by_age\"},{\"question\":\"Who is number 1 president?\",\"snippet\":\"Abraham Lincoln has taken the highest ranking in each survey and George Washington, Franklin D. Roosevelt, and Theodore Roosevelt have always ranked in the top five while James Buchanan, Andrew Johnson, and Franklin Pierce have been ranked at the bottom of all four surveys.\",\"title\":\"Historical rankings of presidents of the United States - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Historical_rankings_of_presidents_of_the_United_States\"}],\"relatedSearches\":[{\"query\":\"Who is the Vice President of the United States\"},{\"query\":\"Who is the 46th president\"},{\"query\":\"All Presidents in order\"},{\"query\":\"48th president of the United States\"},{\"query\":\"Who is the New president of the United States\"},{\"query\":\"Joe Biden age\"},{\"query\":\"47th President of the United States\"},{\"query\":\"First president of USA\"}],\"credits\":1}" -} diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-b906c3b4c8019936fe115e4e62d3994c.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-b906c3b4c8019936fe115e4e62d3994c.json deleted file mode 100644 index 7120493..0000000 --- a/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-b906c3b4c8019936fe115e4e62d3994c.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:41:38 GMT", - "Content-Type": "application\/json", - "Content-Length": "762", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AKyBtzdOThyrXdQHyqVduKWsGLQCn\",\n \"object\": \"chat.completion\",\n \"created\": 1729561297,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"The user wanted to know about the Vice President following the confirmation that Joe Biden is the current President of the United States.\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 134,\n \"completion_tokens\": 24,\n \"total_tokens\": 158,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-de2f99ba9fd74f13849ee043bcee4bdf.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-de2f99ba9fd74f13849ee043bcee4bdf.json deleted file mode 100644 index b43fa9a..0000000 --- a/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-de2f99ba9fd74f13849ee043bcee4bdf.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:40:54 GMT", - "Content-Type": "application\/json", - "Content-Length": "706", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AKyBBDJ6NEok04RrR1sqhDRtUNmqc\",\n \"object\": \"chat.completion\",\n \"created\": 1729561253,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"The user requested to search Google for the current President of the United States.\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 54,\n \"completion_tokens\": 15,\n \"total_tokens\": 69,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-ee890dab1469e9a09f9960cb3f09bf6d.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-ee890dab1469e9a09f9960cb3f09bf6d.json deleted file mode 100644 index ad35bfd..0000000 --- a/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-ee890dab1469e9a09f9960cb3f09bf6d.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:40:57 GMT", - "Content-Type": "application/json", - "Content-Length": "885", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AKyBEvI5AofCNQk8dGLLqHG5TsQt7\",\n \"object\": \"chat.completion\",\n \"created\": 1729561256,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"The user requested to search Google for the current President of the United States. Using the serper_tool, the results showed multiple references confirming that Joe Biden is the current President of the United States, serving as the 46th president since 2021.\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 746,\n \"completion_tokens\": 51,\n \"total_tokens\": 797,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Memory/DatabaseMemory-495ba0207bd93966fcb5547c5509fadb.json b/tests/Fixtures/Saloon/Memory/DatabaseMemory-495ba0207bd93966fcb5547c5509fadb.json deleted file mode 100644 index 50e82b6..0000000 --- a/tests/Fixtures/Saloon/Memory/DatabaseMemory-495ba0207bd93966fcb5547c5509fadb.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:28:59 GMT", - "Content-Type": "application/json", - "Content-Length": "700", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "814", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999867", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "3ms", - "x-request-id": "req_a4bac68eb7d7a76ad2a793e80a8218b1", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=2x1PuHrqwDqQco4Ix1Eulg_5eOvLN4LGQm6XNJtm69M-1729560539-1.0.1.1-FWGy71BtK4BF6u5pxEmeYbY.YMaAddyBqjc_E1a.AYmnQtfhG.v0s_mmGfT1V3GuId1hka1EtP3ppY3yOnU3Pw; path=/; expires=Tue, 22-Oct-24 01:58:59 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=09Iz6Fidm4vDRcvj4rhCfC4qlyVsjpHqz68CeTqpAXc-1729560539653-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b6b6fc6b3344-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKxzeRQRG836TY7nG3trfn43Nk5Us\",\n \"object\": \"chat.completion\",\n \"created\": 1729560538,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\".sdrawkcab tuB ?yas tsuj I did tahw\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 112,\n \"completion_tokens\": 26,\n \"total_tokens\": 138,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Memory/DatabaseMemory-ccd0a3decc142cdd6d28fc823fb70573.json b/tests/Fixtures/Saloon/Memory/DatabaseMemory-ccd0a3decc142cdd6d28fc823fb70573.json deleted file mode 100644 index e8c7359..0000000 --- a/tests/Fixtures/Saloon/Memory/DatabaseMemory-ccd0a3decc142cdd6d28fc823fb70573.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Fri, 11 Oct 2024 22:29:22 GMT", - "Content-Type": "application\/json", - "Content-Length": "679", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AHIQMXfVSSZy4enUogfNF6wnVR2G9\",\n \"object\": \"chat.completion\",\n \"created\": 1728685762,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"answer\\\": \\\".sdrawkcab yas tsuj I did tahw\\\"\\n}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 77,\n \"completion_tokens\": 20,\n \"total_tokens\": 97,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Memory/DatabaseMemory-d14909a03783ba5b88f3dea252a1f37a.json b/tests/Fixtures/Saloon/Memory/DatabaseMemory-d14909a03783ba5b88f3dea252a1f37a.json deleted file mode 100644 index 89919e4..0000000 --- a/tests/Fixtures/Saloon/Memory/DatabaseMemory-d14909a03783ba5b88f3dea252a1f37a.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Fri, 11 Oct 2024 22:29:21 GMT", - "Content-Type": "application\/json", - "Content-Length": "683", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AHIQLLSmcAp0r2oKO8owGTUQI2gQw\",\n \"object\": \"chat.completion\",\n \"created\": 1728685761,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"answer\\\": \\\"Hello! How can I assist you today?\\\"\\n}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 71,\n \"completion_tokens\": 16,\n \"total_tokens\": 87,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Memory/DatabaseMemory-fe703367aa1f98d7884652612a3c77a6.json b/tests/Fixtures/Saloon/Memory/DatabaseMemory-fe703367aa1f98d7884652612a3c77a6.json deleted file mode 100644 index 68a13a8..0000000 --- a/tests/Fixtures/Saloon/Memory/DatabaseMemory-fe703367aa1f98d7884652612a3c77a6.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:28:58 GMT", - "Content-Type": "application/json", - "Content-Length": "699", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "713", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999871", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "3ms", - "x-request-id": "req_0ad66874bca30e90a762f870164e6daf", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=eYiKNfU2u7krCUQda0_2IGklMhCJJcQ.s.ZO_4Ov.Ig-1729560538-1.0.1.1-TPvjywQitZ6hfmN_fhOYM6Ohm2KJpB02G_4zvFFxN7BWGOvOpkQhlFcRxObcLnHkD9oIvPHxKaUGKHTLV3XYKg; path=/; expires=Tue, 22-Oct-24 01:58:58 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=mqdo9Lfc5FHkdb5ZItd6Gd4zVDZli7BgWgoD3Oy2u74-1729560538317-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b6af4a8e7279-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKxzdkhKVl4ZdLbXJgpaPc7lEK1wQ\",\n \"object\": \"chat.completion\",\n \"created\": 1729560537,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Hello! How can I assist you today?\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 106,\n \"completion_tokens\": 20,\n \"total_tokens\": 126,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/ClearbitCompanyTool-16d091022a41b3b3ba0ece72a85fd909.json b/tests/Fixtures/Saloon/Tools/ClearbitCompanyTool-16d091022a41b3b3ba0ece72a85fd909.json new file mode 100644 index 0000000..ca474a4 --- /dev/null +++ b/tests/Fixtures/Saloon/Tools/ClearbitCompanyTool-16d091022a41b3b3ba0ece72a85fd909.json @@ -0,0 +1,27 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Fri, 25 Oct 2024 23:46:30 GMT", + "Content-Type": "application/json", + "Content-Length": "1199", + "Connection": "keep-alive", + "access-control-expose-headers": "X-Request-ID", + "openai-organization": "REDACTED", + "openai-processing-ms": "2440", + "openai-version": "2020-10-01", + "x-ratelimit-limit-requests": "10000", + "x-ratelimit-limit-tokens": "2000000", + "x-ratelimit-remaining-requests": "9999", + "x-ratelimit-remaining-tokens": "1999764", + "x-ratelimit-reset-requests": "6ms", + "x-ratelimit-reset-tokens": "7ms", + "x-request-id": "REDACTED", + "strict-transport-security": "max-age=31536000; includeSubDomains; preload", + "CF-Cache-Status": "DYNAMIC", + "X-Content-Type-Options": "nosniff", + "Server": "cloudflare", + "CF-RAY": "REDACTED", + "alt-svc": "h3=\":443\"; ma=86400" + }, + "data": "{\n \"id\": \"chatcmpl-AMOIdmmNsVS1uOqx9EIa4cpLTvZIN\",\n \"object\": \"chat.completion\",\n \"created\": 1729899987,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"OpenAI, Inc. is an AI research company dedicated to creating and promoting friendly AI in a way that benefits humanity as a whole. They prioritize human values and emphasize diversity in the development of AI technologies. This company operates in the Health Care sector, specifically in Life Sciences Tools & Services. Their activities span various fields including Information Technology & Services, Academic Research, Physical Sciences, Engineering, Life Sciences, and Scientific & Academic Research, with a focus on B2B services.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 265,\n \"completion_tokens\": 107,\n \"total_tokens\": 372,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_ed14c08274\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Tools/ClearbitCompanyTool-41fce475054295b2a2d1473d04f7aa9c.json b/tests/Fixtures/Saloon/Tools/ClearbitCompanyTool-41fce475054295b2a2d1473d04f7aa9c.json deleted file mode 100644 index d70c432..0000000 --- a/tests/Fixtures/Saloon/Tools/ClearbitCompanyTool-41fce475054295b2a2d1473d04f7aa9c.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Fri, 04 Oct 2024 14:08:49 GMT", - "Content-Type": "application\/json", - "Transfer-Encoding": "chunked" - }, - "data": "{\n \"id\": \"chatcmpl-AEdH6eXHJ9aYLlivszEr8WUOWiBFD\",\n \"object\": \"chat.completion\",\n \"created\": 1728050928,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_mRZAQmndYAUYzFpJMnTlWWfa\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"clearbit_company_tool\",\n \"arguments\": \"{\\\"domain\\\":\\\"openai.com\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 119,\n \"completion_tokens\": 18,\n \"total_tokens\": 137,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_82bed303cf\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/ClearbitCompanyTool-46246d8bf1cf8981b79398408f1c9374.json b/tests/Fixtures/Saloon/Tools/ClearbitCompanyTool-46246d8bf1cf8981b79398408f1c9374.json deleted file mode 100644 index 2e6b146..0000000 --- a/tests/Fixtures/Saloon/Tools/ClearbitCompanyTool-46246d8bf1cf8981b79398408f1c9374.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Fri, 04 Oct 2024 14:09:22 GMT", - "Content-Type": "application/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AEdHXRO4CywC6H5EhEMgONveMlSbu\",\n \"object\": \"chat.completion\",\n \"created\": 1728050955,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"OpenAI is an AI research company focused on safe and beneficial artificial intelligence for all, prioritizing human values and diversity in technology.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 230,\n \"completion_tokens\": 38,\n \"total_tokens\": 268,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_82bed303cf\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/ClearbitCompanyTool-4844006bb7346a8cd4946135a26bb2f2.json b/tests/Fixtures/Saloon/Tools/ClearbitCompanyTool-4844006bb7346a8cd4946135a26bb2f2.json deleted file mode 100644 index 9eea816..0000000 --- a/tests/Fixtures/Saloon/Tools/ClearbitCompanyTool-4844006bb7346a8cd4946135a26bb2f2.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:29:05 GMT", - "Content-Type": "application\/json", - "Content-Length": "1181", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "3842", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999764", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "7ms", - "x-request-id": "req_ac23ffb783a250f76b95115937089a7e", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=Us0iTr53ncmzPI8qVv.1x9gVdpPlJR5GeAy5hjlRbKI-1729560545-1.0.1.1-.0NSN.9zujuAIUPwIRDuGHoncs0LiyKBgnHv1SaRAmVsY8yH_G3KUmjfM6evehR2C1aoLhBREPPm5BmOLUgBIw; path=\/; expires=Tue, 22-Oct-24 01:59:05 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=JUryU1x.ZbpzxhkUdSU1hFX4eOsscQQdP23.AuOAq_o-1729560545365-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b6c689a88c81-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKxzhNxpVwFrmbcoILCEXEgQwop3G\",\n \"object\": \"chat.completion\",\n \"created\": 1729560541,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"OpenAI, legally known as OpenAI, Inc., is an AI research company dedicated to developing safe and beneficial artificial intelligence that aligns with human values and promotes diversity in technology. It operates primarily in the Health Care sector and the Life Sciences Tools & Services industry. Its activities span across various areas including Information Technology & Services, Academic Research, Physical Sciences, Engineering, Life Sciences, and Scientific & Academic Research, with a focus on B2B services.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 265,\n \"completion_tokens\": 103,\n \"total_tokens\": 368,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Tools/ClearbitCompanyTool-503bf8fd461d39c783d3b774fa78b28f.json b/tests/Fixtures/Saloon/Tools/ClearbitCompanyTool-503bf8fd461d39c783d3b774fa78b28f.json index a4c94c7..22ecdaa 100644 --- a/tests/Fixtures/Saloon/Tools/ClearbitCompanyTool-503bf8fd461d39c783d3b774fa78b28f.json +++ b/tests/Fixtures/Saloon/Tools/ClearbitCompanyTool-503bf8fd461d39c783d3b774fa78b28f.json @@ -1,13 +1,13 @@ { "statusCode": 200, "headers": { - "Date": "Tue, 22 Oct 2024 01:29:01 GMT", + "Date": "Fri, 25 Oct 2024 23:46:26 GMT", "Content-Type": "application\/json", "Content-Length": "919", "Connection": "keep-alive", "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "907", + "openai-organization": "REDACTED", + "openai-processing-ms": "681", "openai-version": "2020-10-01", "x-ratelimit-limit-requests": "10000", "x-ratelimit-limit-tokens": "2000000", @@ -15,17 +15,13 @@ "x-ratelimit-remaining-tokens": "1999873", "x-ratelimit-reset-requests": "6ms", "x-ratelimit-reset-tokens": "3ms", - "x-request-id": "req_f7878283ef6e18fcbf8132cee5a0455a", + "x-request-id": "REDACTED", "strict-transport-security": "max-age=31536000; includeSubDomains; preload", "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=6PHlwDjNI4H8glQRkd60601.Ugl1R_yvcWt7VR5VnGc-1729560541-1.0.1.1-I3JFrCPq6ai.iZqPLR9_w6QrkeKNJjojD.uHff1lUhqSlXO1YgtP.z7eVBo9XVNPdd1vR3.MnMCssiyz.XA0yw; path=\/; expires=Tue, 22-Oct-24 01:59:01 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=2GChtEo6KKIVnEn5jTl_4DGZZEcHXVLwkUk23.Xec2w-1729560541014-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], "X-Content-Type-Options": "nosniff", "Server": "cloudflare", - "CF-RAY": "8d65b6befdf819aa-EWR", + "CF-RAY": "REDACTED", "alt-svc": "h3=\":443\"; ma=86400" }, - "data": "{\n \"id\": \"chatcmpl-AKxzgDWV6kDn2eoCLTjCIoEfoaPPS\",\n \"object\": \"chat.completion\",\n \"created\": 1729560540,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_qZ3lmgIblORUAfduIGJHeDcS\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"clearbit_company_tool\",\n \"arguments\": \"{\\\"domain\\\":\\\"openai.com\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 154,\n \"completion_tokens\": 18,\n \"total_tokens\": 172,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} \ No newline at end of file + "data": "{\n \"id\": \"chatcmpl-AMOIcQDoTchH6epkconRmwF2qLAlu\",\n \"object\": \"chat.completion\",\n \"created\": 1729899986,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_kIA6AP8Th19awMZzLKkjGBqz\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"clearbit_company_tool\",\n \"arguments\": \"{\\\"domain\\\":\\\"openai.com\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 154,\n \"completion_tokens\": 18,\n \"total_tokens\": 172,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_ed14c08274\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Tools/ClearbitCompanyTool-Tool.json b/tests/Fixtures/Saloon/Tools/ClearbitCompanyTool-Tool.json index f0e6c76..6ba8a9d 100644 --- a/tests/Fixtures/Saloon/Tools/ClearbitCompanyTool-Tool.json +++ b/tests/Fixtures/Saloon/Tools/ClearbitCompanyTool-Tool.json @@ -1,8 +1,11 @@ { - "statusCode": 200, - "headers": { - "content-type": "application\/json", - "x-api-version": "2019-12-19" - }, - "data": "{\n \"id\": \"d14197b7-cbf2-4276-9593-a53a7d486aa7\",\n \"name\": \"OpenAI\",\n \"legalName\": \"OpenAI, Inc.\",\n \"domain\": \"openai.com\",\n \"domainAliases\": [\n\n ],\n \"site\": {\n \"phoneNumbers\": [\n\n ],\n \"emailAddresses\": [\n \"privacy@openai.com\",\n \"dsar@openai.com\",\n \"dpo@openai.com\",\n \"legal@openai.com\"\n ]\n },\n \"category\": {\n \"sector\": \"Health Care\",\n \"industryGroup\": \"Pharmaceuticals, Biotechnology & Life Sciences\",\n \"industry\": \"Life Sciences Tools & Services\",\n \"subIndustry\": \"Life Sciences Tools & Services\",\n \"gicsCode\": \"20202020\",\n \"sicCode\": \"87\",\n \"sic4Codes\": [\n \"8733\"\n ],\n \"naicsCode\": \"54\",\n \"naics6Codes\": [\n \"541715\"\n ],\n \"naics6Codes2022\": [\n \"541715\"\n ]\n },\n \"tags\": [\n \"Information Technology & Services\",\n \"Academic Research\",\n \"Physical Sciences\",\n \"Engineering\",\n \"Life Sciences\",\n \"Scientific & Academic Research\",\n \"B2B\"\n ],\n \"description\": \"OpenAI is an AI research company focused on safe and beneficial artificial intelligence for all, prioritizing human values and diversity in technology.\",\n \"foundedYear\": 2015,\n \"location\": \"Poineer building, 3180 18th St, San Francisco, CA 94110, USA\",\n \"timeZone\": \"America\/Los_Angeles\",\n \"utcOffset\": -7,\n \"geo\": {\n \"streetNumber\": \"3180\",\n \"streetName\": \"18th Street\",\n \"subPremise\": null,\n \"streetAddress\": \"3180 18th Street\",\n \"city\": \"San Francisco\",\n \"postalCode\": \"94110\",\n \"state\": \"California\",\n \"stateCode\": \"CA\",\n \"country\": \"United States\",\n \"countryCode\": \"US\",\n \"lat\": 37.7623346,\n \"lng\": -122.4146878\n },\n \"logo\": \"https:\/\/logo.clearbit.com\/openai.com\",\n \"facebook\": {\n \"handle\": \"openai.research\",\n \"likes\": 6602\n },\n \"linkedin\": {\n \"handle\": \"company\/openai\"\n },\n \"twitter\": {\n \"handle\": \"OpenAI\",\n \"id\": \"4398626122\",\n \"bio\": \"OpenAI\u2019s mission is to ensure that artificial general intelligence benefits all of humanity. We\u2019re hiring: https:\/\/t.co\/dJGr6LgzPA\",\n \"followers\": 1893255,\n \"following\": 0,\n \"location\": \"\",\n \"site\": \"https:\/\/t.co\/3bPlZZkvdL\",\n \"avatar\": \"https:\/\/pbs.twimg.com\/profile_images\/1634058036934500352\/b4F1eVpJ_normal.jpg\"\n },\n \"crunchbase\": {\n \"handle\": \"organization\/openai\"\n },\n \"emailProvider\": false,\n \"type\": \"education\",\n \"ticker\": null,\n \"identifiers\": {\n \"usEIN\": null,\n \"usCIK\": null\n },\n \"phone\": null,\n \"metrics\": {\n \"alexaUsRank\": 700,\n \"alexaGlobalRank\": 1151,\n \"trafficRank\": \"very_high\",\n \"employees\": 770,\n \"employeesRange\": \"251-1K\",\n \"marketCap\": null,\n \"raised\": 300000000,\n \"annualRevenue\": 28000000,\n \"estimatedAnnualRevenue\": \"$10M-$50M\",\n \"fiscalYearEnd\": null\n },\n \"indexedAt\": \"2024-09-29T02:53:13.436Z\",\n \"tech\": [\n \"google_apps\",\n \"microsoft_exchange_online\",\n \"outlook\",\n \"vimeo\",\n \"apache_kafka\",\n \"stripe\",\n \"github\",\n \"postgresql\"\n ],\n \"techCategories\": [\n \"productivity\",\n \"email_hosting_service\",\n \"image_video_services\",\n \"data_processing\",\n \"payment\",\n \"database\"\n ],\n \"parent\": {\n \"domain\": null\n },\n \"ultimateParent\": {\n \"domain\": null\n }\n}" + "statusCode": 200, + "headers": { + "content-type": "application/json", + "x-api-version": "2019-12-19", + "x-ratelimit-limit": "600", + "x-ratelimit-remaining": "599", + "x-ratelimit-reset": "1729900046" + }, + "data": "{\n \"id\": \"d14197b7-cbf2-4276-9593-a53a7d486aa7\",\n \"name\": \"OpenAI\",\n \"legalName\": \"OpenAI, Inc.\",\n \"domain\": \"openai.com\",\n \"domainAliases\": [\n\n ],\n \"site\": {\n \"phoneNumbers\": [\n\n ],\n \"emailAddresses\": [\n \"privacy@openai.com\",\n \"dsar@openai.com\",\n \"dpo@openai.com\",\n \"legal@openai.com\"\n ]\n },\n \"category\": {\n \"sector\": \"Health Care\",\n \"industryGroup\": \"Pharmaceuticals, Biotechnology & Life Sciences\",\n \"industry\": \"Life Sciences Tools & Services\",\n \"subIndustry\": \"Life Sciences Tools & Services\",\n \"gicsCode\": \"20202020\",\n \"sicCode\": \"87\",\n \"sic4Codes\": [\n \"8733\"\n ],\n \"naicsCode\": \"54\",\n \"naics6Codes\": [\n \"541715\"\n ],\n \"naics6Codes2022\": [\n \"541715\"\n ]\n },\n \"tags\": [\n \"Information Technology & Services\",\n \"Academic Research\",\n \"Physical Sciences\",\n \"Engineering\",\n \"Life Sciences\",\n \"Scientific & Academic Research\",\n \"B2B\"\n ],\n \"description\": \"OpenAI is an AI research company focused on safe and beneficial artificial intelligence for all, prioritizing human values and diversity in technology.\",\n \"foundedYear\": 2015,\n \"location\": \"Poineer building, 3180 18th St, San Francisco, CA 94110, USA\",\n \"timeZone\": \"America/Los_Angeles\",\n \"utcOffset\": -7,\n \"geo\": {\n \"streetNumber\": \"3180\",\n \"streetName\": \"18th Street\",\n \"subPremise\": null,\n \"streetAddress\": \"3180 18th Street\",\n \"city\": \"San Francisco\",\n \"postalCode\": \"94110\",\n \"state\": \"California\",\n \"stateCode\": \"CA\",\n \"country\": \"United States\",\n \"countryCode\": \"US\",\n \"lat\": 37.7623346,\n \"lng\": -122.4146878\n },\n \"logo\": \"https://logo.clearbit.com/openai.com\",\n \"facebook\": {\n \"handle\": \"openai.research\",\n \"likes\": 6602\n },\n \"linkedin\": {\n \"handle\": \"company/openai\"\n },\n \"twitter\": {\n \"handle\": \"OpenAI\",\n \"id\": \"4398626122\",\n \"bio\": \"OpenAI\u2019s mission is to ensure that artificial general intelligence benefits all of humanity. We\u2019re hiring: https://t.co/dJGr6LgzPA\",\n \"followers\": 1893255,\n \"following\": 0,\n \"location\": \"\",\n \"site\": \"https://t.co/3bPlZZkvdL\",\n \"avatar\": \"https://pbs.twimg.com/profile_images/1634058036934500352/b4F1eVpJ_normal.jpg\"\n },\n \"crunchbase\": {\n \"handle\": \"organization/openai\"\n },\n \"emailProvider\": false,\n \"type\": \"education\",\n \"ticker\": null,\n \"identifiers\": {\n \"usEIN\": null,\n \"usCIK\": null\n },\n \"phone\": null,\n \"metrics\": {\n \"alexaUsRank\": 700,\n \"alexaGlobalRank\": 1151,\n \"trafficRank\": \"very_high\",\n \"employees\": 770,\n \"employeesRange\": \"251-1K\",\n \"marketCap\": null,\n \"raised\": 300000000,\n \"annualRevenue\": 28000000,\n \"estimatedAnnualRevenue\": \"$10M-$50M\",\n \"fiscalYearEnd\": null\n },\n \"indexedAt\": \"2024-10-18T15:54:08.133Z\",\n \"tech\": [\n \"google_apps\",\n \"microsoft_exchange_online\",\n \"outlook\",\n \"vimeo\",\n \"apache_kafka\",\n \"stripe\",\n \"github\",\n \"postgresql\"\n ],\n \"techCategories\": [\n \"productivity\",\n \"email_hosting_service\",\n \"image_video_services\",\n \"data_processing\",\n \"payment\",\n \"database\"\n ],\n \"parent\": {\n \"domain\": null\n },\n \"ultimateParent\": {\n \"domain\": null\n }\n}" } diff --git a/tests/Fixtures/Saloon/Tools/CrunchbaseTool-45750ef652ddceeaa4b56a6798ccee02.json b/tests/Fixtures/Saloon/Tools/CrunchbaseTool-45750ef652ddceeaa4b56a6798ccee02.json deleted file mode 100644 index 9372e3c..0000000 --- a/tests/Fixtures/Saloon/Tools/CrunchbaseTool-45750ef652ddceeaa4b56a6798ccee02.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Fri, 04 Oct 2024 13:59:51 GMT", - "Content-Type": "application/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AEd8Rfeihc8ExizWSphUAU1n7CFle\",\n \"object\": \"chat.completion\",\n \"created\": 1728050391,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_mRZAQmndYAUYzFpJMnTlWWfa\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"crunchbase_tool\",\n \"arguments\": \"{\\\"entityId\\\":\\\"siteimprove\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 115,\n \"completion_tokens\": 19,\n \"total_tokens\": 134,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_82bed303cf\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/CrunchbaseTool-527a61c765676b4729099512e1a42e6a.json b/tests/Fixtures/Saloon/Tools/CrunchbaseTool-527a61c765676b4729099512e1a42e6a.json index 18ca178..6d221b9 100644 --- a/tests/Fixtures/Saloon/Tools/CrunchbaseTool-527a61c765676b4729099512e1a42e6a.json +++ b/tests/Fixtures/Saloon/Tools/CrunchbaseTool-527a61c765676b4729099512e1a42e6a.json @@ -1,13 +1,13 @@ { "statusCode": 200, "headers": { - "Date": "Tue, 22 Oct 2024 01:29:07 GMT", + "Date": "Fri, 25 Oct 2024 23:45:07 GMT", "Content-Type": "application\/json", "Content-Length": "916", "Connection": "keep-alive", "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "965", + "openai-organization": "REDACTED", + "openai-processing-ms": "830", "openai-version": "2020-10-01", "x-ratelimit-limit-requests": "10000", "x-ratelimit-limit-tokens": "2000000", @@ -15,17 +15,13 @@ "x-ratelimit-remaining-tokens": "1999871", "x-ratelimit-reset-requests": "6ms", "x-ratelimit-reset-tokens": "3ms", - "x-request-id": "req_3de368cb5b6df9fd0bfc65e58977668b", + "x-request-id": "REDACTED", "strict-transport-security": "max-age=31536000; includeSubDomains; preload", "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=GmnVDsX_tel0VVHmwOjaCuoGzwlIbTebGdZ05HZy.Gw-1729560547-1.0.1.1-HOfG1tkrOD3vsmh8Z9VEYt27ySKLa_WoFELF0bFbZj6JgwRghAtCUalzRXUGjgxWBvB9nnEs3aBazHWVtOEzmQ; path=\/; expires=Tue, 22-Oct-24 01:59:07 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=pkOCF9gLZOrlgy4TAwnXAkVpp56bOXL4KwHoSnfI58c-1729560547103-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], "X-Content-Type-Options": "nosniff", "Server": "cloudflare", - "CF-RAY": "8d65b6e4896a72b6-EWR", + "CF-RAY": "REDACTED", "alt-svc": "h3=\":443\"; ma=86400" }, - "data": "{\n \"id\": \"chatcmpl-AKxzmMFGNIkX3K9QwdAkfLRH93HwA\",\n \"object\": \"chat.completion\",\n \"created\": 1729560546,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_xhzwdqGvs52gZDBu70IQo3iC\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"crunchbase_tool\",\n \"arguments\": \"{\\\"entityId\\\":\\\"siteimprove\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 150,\n \"completion_tokens\": 19,\n \"total_tokens\": 169,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} \ No newline at end of file + "data": "{\n \"id\": \"chatcmpl-AMOHKTa1di3eEfc1pqS3KznqeHrWT\",\n \"object\": \"chat.completion\",\n \"created\": 1729899906,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_YxTtmS5sZ3XP3sj137SH5c64\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"crunchbase_tool\",\n \"arguments\": \"{\\\"entityId\\\":\\\"siteimprove\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 150,\n \"completion_tokens\": 19,\n \"total_tokens\": 169,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_ed14c08274\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Tools/CrunchbaseTool-53741f3dfe7c8ca47ce535174669b15d.json b/tests/Fixtures/Saloon/Tools/CrunchbaseTool-53741f3dfe7c8ca47ce535174669b15d.json new file mode 100644 index 0000000..0f3d04f --- /dev/null +++ b/tests/Fixtures/Saloon/Tools/CrunchbaseTool-53741f3dfe7c8ca47ce535174669b15d.json @@ -0,0 +1,27 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Fri, 25 Oct 2024 23:45:12 GMT", + "Content-Type": "application/json", + "Content-Length": "1333", + "Connection": "keep-alive", + "access-control-expose-headers": "X-Request-ID", + "openai-organization": "REDACTED", + "openai-processing-ms": "4480", + "openai-version": "2020-10-01", + "x-ratelimit-limit-requests": "10000", + "x-ratelimit-limit-tokens": "2000000", + "x-ratelimit-remaining-requests": "9999", + "x-ratelimit-remaining-tokens": "1999230", + "x-ratelimit-reset-requests": "6ms", + "x-ratelimit-reset-tokens": "23ms", + "x-request-id": "REDACTED", + "strict-transport-security": "max-age=31536000; includeSubDomains; preload", + "CF-Cache-Status": "DYNAMIC", + "X-Content-Type-Options": "nosniff", + "Server": "cloudflare", + "CF-RAY": "REDACTED", + "alt-svc": "h3=\":443\"; ma=86400" + }, + "data": "{\n \"id\": \"chatcmpl-AMOHMfcJhBXCZ730TqBaxnQlw3sjR\",\n \"object\": \"chat.completion\",\n \"created\": 1729899908,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Siteimprove is a company that provides comprehensive cloud-based digital presence optimization software. It has its headquarters in Copenhagen, Denmark. The organization offers services and products to improve website performance, accessibility, and compliance. Siteimprove has a global presence and is recognized within its industry with a current corporate rank of 1562. More details including their LinkedIn, Facebook, and Twitter profiles can be accessed via their respective URLs: http://www.linkedin.com/company/siteimprove, http://www.facebook.com/Siteimprove, and https://x.com/Siteimprove. Visit their website at http://siteimprove.com for more information.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 896,\n \"completion_tokens\": 139,\n \"total_tokens\": 1035,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_4dba7dd7b3\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Tools/CrunchbaseTool-91330c935ee3c0271e4611b376117ea7.json b/tests/Fixtures/Saloon/Tools/CrunchbaseTool-91330c935ee3c0271e4611b376117ea7.json deleted file mode 100644 index 38ae583..0000000 --- a/tests/Fixtures/Saloon/Tools/CrunchbaseTool-91330c935ee3c0271e4611b376117ea7.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:29:11 GMT", - "Content-Type": "application/json", - "Content-Length": "1127", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "3809", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999230", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "23ms", - "x-request-id": "req_db34286a7841fcc189d87cf8e4be8d19", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=o0FpqBcFHHGUkxDANXhS7Xr.gT8kO.heNuPXgBCz6eQ-1729560551-1.0.1.1-.Dwg9rr7MpxbVWO9SznPODRQr9zJn2qHF09HO2ZRf09Zj1PMzxSXC_0dsQbIAJKa1QfkmhtxTD65ShurNIgJAw; path=/; expires=Tue, 22-Oct-24 01:59:11 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=Uc1vEOnA4NTZFd30WQJN2Qu4BuHhfnqRjwStORjqVe4-1729560551263-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b6ecce0a8ce6-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKxznJ52joKwF2QqtalZLLGjV5936\",\n \"object\": \"chat.completion\",\n \"created\": 1729560547,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Siteimprove offers comprehensive cloud-based digital presence optimization software. Located in Copenhagen, Denmark, the company also has locations in Hovedstaden and is prominent within Europe. Siteimprove has an active presence on LinkedIn, Facebook, and Twitter. More details about the company can be found on their website at http://siteimprove.com. The company was created on June 21, 2014, and the latest update on their profile was on September 3, 2024.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 898,\n \"completion_tokens\": 110,\n \"total_tokens\": 1008,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/CrunchbaseTool-94745683d5f8f1ed70612a5c036d54bf.json b/tests/Fixtures/Saloon/Tools/CrunchbaseTool-94745683d5f8f1ed70612a5c036d54bf.json deleted file mode 100644 index 1a78ff3..0000000 --- a/tests/Fixtures/Saloon/Tools/CrunchbaseTool-94745683d5f8f1ed70612a5c036d54bf.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Fri, 04 Oct 2024 14:03:00 GMT", - "Content-Type": "application\/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AEdBP55xlCkeEdXugbO3OGzRBFGh8\",\n \"object\": \"chat.completion\",\n \"created\": 1728050575,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Siteimprove offers comprehensive cloud-based digital presence optimization software. This company is based in Copenhagen, Denmark, and has a presence across multiple locations including Hovedstaden and the broader European region. Siteimprove's digital footprint includes a LinkedIn page available at http:\/\/www.linkedin.com\/company\/siteimprove, a Facebook page at http:\/\/www.facebook.com\/Siteimprove, and a Twitter profile at https:\/\/x.com\/Siteimprove. More about the company can be found on their website: http:\/\/siteimprove.com.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 863,\n \"completion_tokens\": 119,\n \"total_tokens\": 982,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_82bed303cf\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/CrunchbaseTool-Tool.json b/tests/Fixtures/Saloon/Tools/CrunchbaseTool-Tool.json index 57c6fdb..484e205 100644 --- a/tests/Fixtures/Saloon/Tools/CrunchbaseTool-Tool.json +++ b/tests/Fixtures/Saloon/Tools/CrunchbaseTool-Tool.json @@ -3,7 +3,7 @@ "headers": { "Cache-Control": "no-cache, private", "Content-Type": "application\/json", - "Date": "Fri, 04 Oct 2024 13:59:52 GMT" + "Date": "Fri, 25 Oct 2024 23:45:07 GMT" }, - "data": "{\"properties\":{\"identifier\":{\"uuid\":\"c41f21f2-3f19-72d2-47cb-bfdd47e45216\",\"value\":\"Siteimprove\",\"image_id\":\"db51071603a0425f95c1bc34b4e04be8\",\"permalink\":\"siteimprove\",\"entity_def_id\":\"organization\"}},\"cards\":{\"fields\":{\"rank_principal\":4400,\"identifier\":{\"uuid\":\"c41f21f2-3f19-72d2-47cb-bfdd47e45216\",\"value\":\"Siteimprove\",\"image_id\":\"db51071603a0425f95c1bc34b4e04be8\",\"permalink\":\"siteimprove\",\"entity_def_id\":\"organization\"},\"linkedin\":{\"value\":\"http:\/\/www.linkedin.com\/company\/siteimprove\"},\"short_description\":\"Siteimprove offers comprehensive cloud-based digital presence optimization software.\",\"rank_org\":4395,\"facebook\":{\"value\":\"http:\/\/www.facebook.com\/Siteimprove\"},\"twitter\":{\"value\":\"https:\/\/x.com\/Siteimprove\"},\"rank_delta_d90\":1.6,\"rank_org_company\":4314,\"rank_delta_d7\":0.3,\"rank_delta_d30\":3.4,\"image_url\":\"https:\/\/images.crunchbase.com\/image\/upload\/t_cb-default-original\/db51071603a0425f95c1bc34b4e04be8\",\"created_at\":\"2014-06-21T05:59:18Z\",\"location_identifiers\":[{\"uuid\":\"c0723e0a-84b4-231e-3cf7-f3be235af6d4\",\"value\":\"Copenhagen\",\"permalink\":\"copenhagen-hovedstaden\",\"entity_def_id\":\"location\",\"location_type\":\"city\"},{\"uuid\":\"cfa7addd-6b5f-8fb3-9968-c6f3ad20b487\",\"value\":\"Hovedstaden\",\"permalink\":\"hovedstaden-denmark\",\"entity_def_id\":\"location\",\"location_type\":\"region\"},{\"uuid\":\"f593ac31-624a-2ccd-a203-ddb04c319a79\",\"value\":\"Denmark\",\"permalink\":\"denmark\",\"entity_def_id\":\"location\",\"location_type\":\"country\"},{\"uuid\":\"6106f5dc-823e-5da8-40d7-51612c0b2c4e\",\"value\":\"Europe\",\"permalink\":\"europe\",\"entity_def_id\":\"location\",\"location_type\":\"continent\"}],\"website_url\":\"http:\/\/siteimprove.com\",\"updated_at\":\"2024-09-03T15:22:07Z\"}}}" + "data": "{\"properties\":{\"identifier\":{\"uuid\":\"c41f21f2-3f19-72d2-47cb-bfdd47e45216\",\"value\":\"Siteimprove\",\"image_id\":\"db51071603a0425f95c1bc34b4e04be8\",\"permalink\":\"siteimprove\",\"entity_def_id\":\"organization\"}},\"cards\":{\"fields\":{\"rank_principal\":1631,\"identifier\":{\"uuid\":\"c41f21f2-3f19-72d2-47cb-bfdd47e45216\",\"value\":\"Siteimprove\",\"image_id\":\"db51071603a0425f95c1bc34b4e04be8\",\"permalink\":\"siteimprove\",\"entity_def_id\":\"organization\"},\"linkedin\":{\"value\":\"http:\/\/www.linkedin.com\/company\/siteimprove\"},\"short_description\":\"Siteimprove offers comprehensive cloud-based digital presence optimization software.\",\"rank_org\":1630,\"facebook\":{\"value\":\"http:\/\/www.facebook.com\/Siteimprove\"},\"twitter\":{\"value\":\"https:\/\/x.com\/Siteimprove\"},\"rank_delta_d90\":9.2,\"rank_org_company\":1562,\"rank_delta_d7\":-1,\"rank_delta_d30\":9.5,\"image_url\":\"https:\/\/images.crunchbase.com\/image\/upload\/t_cb-default-original\/db51071603a0425f95c1bc34b4e04be8\",\"created_at\":\"2014-06-21T05:59:18Z\",\"location_identifiers\":[{\"uuid\":\"c0723e0a-84b4-231e-3cf7-f3be235af6d4\",\"value\":\"Copenhagen\",\"permalink\":\"copenhagen-hovedstaden\",\"entity_def_id\":\"location\",\"location_type\":\"city\"},{\"uuid\":\"cfa7addd-6b5f-8fb3-9968-c6f3ad20b487\",\"value\":\"Hovedstaden\",\"permalink\":\"hovedstaden-denmark\",\"entity_def_id\":\"location\",\"location_type\":\"region\"},{\"uuid\":\"f593ac31-624a-2ccd-a203-ddb04c319a79\",\"value\":\"Denmark\",\"permalink\":\"denmark\",\"entity_def_id\":\"location\",\"location_type\":\"country\"},{\"uuid\":\"6106f5dc-823e-5da8-40d7-51612c0b2c4e\",\"value\":\"Europe\",\"permalink\":\"europe\",\"entity_def_id\":\"location\",\"location_type\":\"continent\"}],\"website_url\":\"http:\/\/siteimprove.com\",\"updated_at\":\"2024-10-09T08:32:57Z\"}}}" } diff --git a/tests/Fixtures/Saloon/Tools/FirecrawlTool-43bcd63cc9d9b98eb8488d0e1a4c4174.json b/tests/Fixtures/Saloon/Tools/FirecrawlTool-43bcd63cc9d9b98eb8488d0e1a4c4174.json index 24d7dd0..d1ad082 100644 --- a/tests/Fixtures/Saloon/Tools/FirecrawlTool-43bcd63cc9d9b98eb8488d0e1a4c4174.json +++ b/tests/Fixtures/Saloon/Tools/FirecrawlTool-43bcd63cc9d9b98eb8488d0e1a4c4174.json @@ -1,10 +1,27 @@ { - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 22:56:26 GMT", - "Content-Type": "application\/json", - "Content-Length": "925", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-ALI5ZTtwrc2JUdgmRZt21iOD939Rz\",\n \"object\": \"chat.completion\",\n \"created\": 1729637785,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_YjRmsL5iZolFwHFh6Gm3r8qM\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"firecrawl_tool\",\n \"arguments\": \"{\\\"url\\\":\\\"https:\/\/www.firecrawl.dev\/\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 158,\n \"completion_tokens\": 21,\n \"total_tokens\": 179,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" + "statusCode": 200, + "headers": { + "Date": "Fri, 25 Oct 2024 23:47:58 GMT", + "Content-Type": "application/json", + "Content-Length": "925", + "Connection": "keep-alive", + "access-control-expose-headers": "X-Request-ID", + "openai-organization": "REDACTED", + "openai-processing-ms": "787", + "openai-version": "2020-10-01", + "x-ratelimit-limit-requests": "10000", + "x-ratelimit-limit-tokens": "2000000", + "x-ratelimit-remaining-requests": "9999", + "x-ratelimit-remaining-tokens": "1999868", + "x-ratelimit-reset-requests": "6ms", + "x-ratelimit-reset-tokens": "3ms", + "x-request-id": "REDACTED", + "strict-transport-security": "max-age=31536000; includeSubDomains; preload", + "CF-Cache-Status": "DYNAMIC", + "X-Content-Type-Options": "nosniff", + "Server": "cloudflare", + "CF-RAY": "REDACTED", + "alt-svc": "h3=\":443\"; ma=86400" + }, + "data": "{\n \"id\": \"chatcmpl-AMOK69XqSun7nD4c0mmAnALLAT122\",\n \"object\": \"chat.completion\",\n \"created\": 1729900078,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_0NAw7fAgEA7GoNFhDraQqkfY\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"firecrawl_tool\",\n \"arguments\": \"{\\\"url\\\":\\\"https://www.firecrawl.dev/\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 158,\n \"completion_tokens\": 21,\n \"total_tokens\": 179,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_ed14c08274\"\n}\n" } diff --git a/tests/Fixtures/Saloon/Tools/FirecrawlTool-76cdcfb02f44fe52a23d1c7248cd0cae.json b/tests/Fixtures/Saloon/Tools/FirecrawlTool-76cdcfb02f44fe52a23d1c7248cd0cae.json deleted file mode 100644 index 95ce921..0000000 --- a/tests/Fixtures/Saloon/Tools/FirecrawlTool-76cdcfb02f44fe52a23d1c7248cd0cae.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 22:57:22 GMT", - "Content-Type": "application\/json", - "Content-Length": "1186", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "3408", - "openai-version": "2020-10-01" - }, - "data": "{\n \"id\": \"chatcmpl-ALI6RfAUfMgMidYGCNGnNrynJLpTD\",\n \"object\": \"chat.completion\",\n \"created\": 1729637839,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"The 'https:\/\/www.firecrawl.dev\/' page is about Firecrawl, a service that allows users to crawl and scrape data from websites, transforming it into clean, structured markdown or data that is ready for LLM (Large Language Models) applications. It provides various features including handling dynamic content, rotating proxies, and scraping without needing a sitemap. Firecrawl offers different pricing plans, is open source, and aims to power AI applications by providing reliable, clean data extracted from any website.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 5112,\n \"completion_tokens\": 110,\n \"total_tokens\": 5222,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/FirecrawlTool-9670841841d278662b0bb2ecc61c6f68.json b/tests/Fixtures/Saloon/Tools/FirecrawlTool-9670841841d278662b0bb2ecc61c6f68.json new file mode 100644 index 0000000..ce58bac --- /dev/null +++ b/tests/Fixtures/Saloon/Tools/FirecrawlTool-9670841841d278662b0bb2ecc61c6f68.json @@ -0,0 +1,27 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Fri, 25 Oct 2024 23:48:07 GMT", + "Content-Type": "application\/json", + "Content-Length": "1137", + "Connection": "keep-alive", + "access-control-expose-headers": "X-Request-ID", + "openai-organization": "REDACTED", + "openai-processing-ms": "2912", + "openai-version": "2020-10-01", + "x-ratelimit-limit-requests": "10000", + "x-ratelimit-limit-tokens": "2000000", + "x-ratelimit-remaining-requests": "9999", + "x-ratelimit-remaining-tokens": "1994965", + "x-ratelimit-reset-requests": "6ms", + "x-ratelimit-reset-tokens": "151ms", + "x-request-id": "REDACTED", + "strict-transport-security": "max-age=31536000; includeSubDomains; preload", + "CF-Cache-Status": "DYNAMIC", + "X-Content-Type-Options": "nosniff", + "Server": "cloudflare", + "CF-RAY": "REDACTED", + "alt-svc": "h3=\":443\"; ma=86400" + }, + "data": "{\n \"id\": \"chatcmpl-AMOKCPKcTDVdl4TynfjEaKju1r30H\",\n \"object\": \"chat.completion\",\n \"created\": 1729900084,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Firecrawl is a service that provides web scraping and data crawling capabilities focusing on delivering clean, LLM-ready (Large Language Models) data from websites. It's designed to empower AI applications by extracting and structuring web content into markdown or other structured data formats. Firecrawl offers tools and features to handle dynamic content, rate limits, and anti-scraping mechanisms, making it ideal for developers, data scientists, and AI researchers.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 5192,\n \"completion_tokens\": 98,\n \"total_tokens\": 5290,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_ed14c08274\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Tools/FirecrawlTool-Tool.json b/tests/Fixtures/Saloon/Tools/FirecrawlTool-Tool.json index d1d1690..229a9e4 100644 --- a/tests/Fixtures/Saloon/Tools/FirecrawlTool-Tool.json +++ b/tests/Fixtures/Saloon/Tools/FirecrawlTool-Tool.json @@ -3,7 +3,8 @@ "headers": { "X-Powered-By": "Express", "Access-Control-Allow-Origin": "*", - "Content-Type": "application\/json; charset=utf-8" + "Content-Type": "application\/json; charset=utf-8", + "Content-Length": "21428" }, - "data": "{\"success\":true,\"data\":{\"markdown\":\"Our first Launch Week is over! [See the recap \ud83d\ude80](blog\/firecrawl-launch-week-1-recap)\\n\\n[\ud83d\udca5 Get 2 months free with yearly plan](\/pricing)\\n\\nTurn websites into \\n_LLM-ready_ data\\n=====================================\\n\\nPower your AI apps with clean data crawled from any website. It's also open-source.\\n\\nStart for free (500 credits)Start for free[Talk to us](https:\/\/calendly.com\/d\/cj83-ngq-knk\/meet-firecrawl)\\n\\nA product by\\n\\n[![Mendable Logo](https:\/\/www.firecrawl.dev\/images\/mendable_logo_transparent.png)Mendable](https:\/\/mendable.ai)\\n\\n![Example Webpage](https:\/\/www.firecrawl.dev\/multiple-websites.png)\\n\\nCrawl, Scrape, Clean\\n--------------------\\n\\nWe crawl all accessible subpages and give you clean markdown for each. No sitemap required.\\n\\n \\n [\\\\\\n {\\\\\\n \\\"url\\\": \\\"https:\/\/www.firecrawl.dev\/\\\",\\\\\\n \\\"markdown\\\": \\\"## Welcome to Firecrawl\\\\\\n Firecrawl is a web scraper that allows you to extract the content of a webpage.\\\"\\\\\\n },\\\\\\n {\\\\\\n \\\"url\\\": \\\"https:\/\/www.firecrawl.dev\/features\\\",\\\\\\n \\\"markdown\\\": \\\"## Features\\\\\\n Discover how Firecrawl's cutting-edge features can \\\\\\n transform your data operations.\\\"\\\\\\n },\\\\\\n {\\\\\\n \\\"url\\\": \\\"https:\/\/www.firecrawl.dev\/pricing\\\",\\\\\\n \\\"markdown\\\": \\\"## Pricing Plans\\\\\\n Choose the perfect plan that fits your needs.\\\"\\\\\\n },\\\\\\n {\\\\\\n \\\"url\\\": \\\"https:\/\/www.firecrawl.dev\/about\\\",\\\\\\n \\\"markdown\\\": \\\"## About Us\\\\\\n Learn more about Firecrawl's mission and the \\\\\\n team behind our innovative platform.\\\"\\\\\\n }\\\\\\n ]\\n \\n\\nNote: The markdown has been edited for display purposes.\\n\\nTrusted by Top Companies\\n------------------------\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/zapier.png)](https:\/\/www.zapier.com)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/gamma.svg)](https:\/\/gamma.app)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/nvidia-com.png)](https:\/\/www.nvidia.com)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/teller-io.svg)](https:\/\/www.teller.io)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/stackai.svg)](https:\/\/www.stack-ai.com)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/palladiumdigital-co-uk.svg)](https:\/\/www.palladiumdigital.co.uk)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/worldwide-casting-com.svg)](https:\/\/www.worldwide-casting.com)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/open-gov-sg.png)](https:\/\/www.open.gov.sg)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/bain-com.svg)](https:\/\/www.bain.com)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/demand-io.svg)](https:\/\/www.demand.io)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/carrefour-logo-1.svg)](https:\/\/www.carrefour.com)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/cyberagent-co-jp.svg)](https:\/\/www.cyberagent.co.jp)\\n\\nIntegrate today\\n---------------\\n\\nEnhance your applications with top-tier web scraping and crawling capabilities.\\n\\n#### Scrape\\n\\nExtract markdown or structured data from websites quickly and efficiently.\\n\\n#### Crawling\\n\\nNavigate and retrieve data from all accessible subpages, even without a sitemap.\\n\\n1\\n\\n2\\n\\n3\\n\\n4\\n\\n5\\n\\n6\\n\\n7\\n\\n8\\n\\n9\\n\\n10\\n\\n\/\/ npm install @mendable\/firecrawl-js \\n \\nimport FirecrawlApp from '@mendable\/firecrawl-js'; \\n \\nconst app \\\\= new FirecrawlApp({ apiKey: \\\"fc-YOUR\\\\_API\\\\_KEY\\\" }); \\n \\n\/\/ Scrape a website: \\nconst scrapeResult \\\\= await app.scrapeUrl('firecrawl.dev'); \\n \\nconsole.log(scrapeResult.data.markdown)\\n\\n#### Use well-known tools\\n\\nAlready fully integrated with the greatest existing tools and workflows.\\n\\n[![LlamaIndex](https:\/\/www.firecrawl.dev\/logos\/llamaindex.svg)](https:\/\/docs.llamaindex.ai\/en\/stable\/examples\/data_connectors\/WebPageDemo\/#using-firecrawl-reader\/)\\n[![Langchain](https:\/\/www.firecrawl.dev\/integrations\/langchain.png)](https:\/\/python.langchain.com\/v0.2\/docs\/integrations\/document_loaders\/firecrawl\/)\\n[![Dify](https:\/\/www.firecrawl.dev\/logos\/dify.png)](https:\/\/dify.ai\/blog\/dify-ai-blog-integrated-with-firecrawl\/)\\n[![Dify](https:\/\/www.firecrawl.dev\/integrations\/langflow_2.png)](https:\/\/www.langflow.org\/)\\n[![Flowise](https:\/\/www.firecrawl.dev\/integrations\/flowise.png)](https:\/\/flowiseai.com\/)\\n[![CrewAI](https:\/\/www.firecrawl.dev\/integrations\/crewai.png)](https:\/\/crewai.com\/)\\n\\n#### Start for free, scale easily\\n\\nKick off your journey for free and scale seamlessly as your project expands.\\n\\n[Try it out](\/signin\/signup)\\n\\n#### Open-source\\n\\nDeveloped transparently and collaboratively. Join our community of contributors.\\n\\n[Check out our repo](https:\/\/github.com\/mendableai\/firecrawl)\\n\\nWe handle the hard stuff\\n------------------------\\n\\nRotating proxies, orchestration, rate limits, js-blocked content and more\\n\\n#### Crawling\\n\\nFirecrawl crawls all accessible subpages, even without a sitemap.\\n\\n#### Dynamic content\\n\\nFirecrawl gathers data even if a website uses javascript to render content.\\n\\n#### To Markdown\\n\\nFirecrawl returns clean, well formatted markdown - ready for use in LLM applications\\n\\n#### Reliability first\\n\\nReliability is our core focus. Firecrawl is designed to ensure you get all the data you need.\\n\\n#### No Caching\\n\\nFirecrawl doesn't cache content by default. You always get the latest data.\\n\\n#### Built for AI\\n\\nBuilt by LLM engineers, for LLM engineers. Giving you clean data the way you want it.\\n\\n#### Smart Wait\\n\\nFirecrawl can intelligently wait for content to load, making scraping faster and more reliable.\\n\\n#### Actions\\n\\nClick, scroll, write, wait, press and more before extracting content.\\n\\n#### Media Parsing\\n\\nFirecrawl can parse and output clean content from web hosted pdfs, docx, images and more.\\n\\nOur wall of love\\n\\nDon't take our word for it\\n--------------------------\\n\\n![Greg Kamradt](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-02.0afeb750.jpg&w=96&q=75)\\n\\nGreg Kamradt\\n\\n[@GregKamradt](https:\/\/twitter.com\/GregKamradt\/status\/1780300642197840307)\\n\\nLLM structured data via API, handling requests, cleaning, and crawling. Enjoyed the early preview.\\n\\n![Amit Naik](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-03.ff5dbe11.jpg&w=96&q=75)\\n\\nAmit Naik\\n\\n[@suprgeek](https:\/\/twitter.com\/suprgeek\/status\/1780338213351035254)\\n\\n#llm success with RAG relies on Retrieval. Firecrawl by @mendableai structures web content for processing. \ud83d\udc4f\\n\\n![Jerry Liu](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-04.76bef0df.jpg&w=96&q=75)\\n\\nJerry Liu\\n\\n[@jerryjliu0](https:\/\/twitter.com\/jerryjliu0\/status\/1781122933349572772)\\n\\nFirecrawl is awesome \ud83d\udd25 Turns web pages into structured markdown for LLM apps, thanks to @mendableai.\\n\\n![Bardia Pourvakil](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-01.025350bc.jpeg&w=96&q=75)\\n\\nBardia Pourvakil\\n\\n[@thepericulum](https:\/\/twitter.com\/thepericulum\/status\/1781397799487078874)\\n\\nThese guys ship. I wanted types for their node SDK, and less than an hour later, I got them. Can't recommend them enough.\\n\\n![latentsauce \ud83e\uddd8\ud83c\udffd](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-07.c2285d35.jpeg&w=96&q=75)\\n\\nlatentsauce \ud83e\uddd8\ud83c\udffd\\n\\n[@latentsauce](https:\/\/twitter.com\/latentsauce\/status\/1781738253927735331)\\n\\nFirecrawl simplifies data preparation significantly, exactly what I was hoping for. Thank you for creating Firecrawl \u2764\ufe0f\u2764\ufe0f\u2764\ufe0f\\n\\n![Greg Kamradt](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-02.0afeb750.jpg&w=96&q=75)\\n\\nGreg Kamradt\\n\\n[@GregKamradt](https:\/\/twitter.com\/GregKamradt\/status\/1780300642197840307)\\n\\nLLM structured data via API, handling requests, cleaning, and crawling. Enjoyed the early preview.\\n\\n![Amit Naik](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-03.ff5dbe11.jpg&w=96&q=75)\\n\\nAmit Naik\\n\\n[@suprgeek](https:\/\/twitter.com\/suprgeek\/status\/1780338213351035254)\\n\\n#llm success with RAG relies on Retrieval. Firecrawl by @mendableai structures web content for processing. \ud83d\udc4f\\n\\n![Jerry Liu](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-04.76bef0df.jpg&w=96&q=75)\\n\\nJerry Liu\\n\\n[@jerryjliu0](https:\/\/twitter.com\/jerryjliu0\/status\/1781122933349572772)\\n\\nFirecrawl is awesome \ud83d\udd25 Turns web pages into structured markdown for LLM apps, thanks to @mendableai.\\n\\n![Bardia Pourvakil](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-01.025350bc.jpeg&w=96&q=75)\\n\\nBardia Pourvakil\\n\\n[@thepericulum](https:\/\/twitter.com\/thepericulum\/status\/1781397799487078874)\\n\\nThese guys ship. I wanted types for their node SDK, and less than an hour later, I got them. Can't recommend them enough.\\n\\n![latentsauce \ud83e\uddd8\ud83c\udffd](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-07.c2285d35.jpeg&w=96&q=75)\\n\\nlatentsauce \ud83e\uddd8\ud83c\udffd\\n\\n[@latentsauce](https:\/\/twitter.com\/latentsauce\/status\/1781738253927735331)\\n\\nFirecrawl simplifies data preparation significantly, exactly what I was hoping for. Thank you for creating Firecrawl \u2764\ufe0f\u2764\ufe0f\u2764\ufe0f\\n\\n![Michael Ning](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-05.76d7cd3e.png&w=96&q=75)\\n\\nMichael Ning\\n\\n[](#)\\n\\nFirecrawl is impressive, saving us 2\/3 the tokens and allowing gpt3.5turbo use over gpt4. Major savings in time and money.\\n\\n![Alex Reibman \ud83d\udd87\ufe0f](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-06.4ee7cf5a.jpeg&w=96&q=75)\\n\\nAlex Reibman \ud83d\udd87\ufe0f\\n\\n[@AlexReibman](https:\/\/twitter.com\/AlexReibman\/status\/1780299595484131836)\\n\\nMoved our internal agent's web scraping tool from Apify to Firecrawl because it benchmarked 50x faster with AgentOps.\\n\\n![Michael](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-08.0bed40be.jpeg&w=96&q=75)\\n\\nMichael\\n\\n[@michael\\\\_chomsky](#)\\n\\nI really like some of the design decisions Firecrawl made, so I really want to share with others.\\n\\n![Paul Scott](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-09.d303b5b4.png&w=96&q=75)\\n\\nPaul Scott\\n\\n[@palebluepaul](https:\/\/twitter.com\/palebluepaul)\\n\\nAppreciating your lean approach, Firecrawl ticks off everything on our list without the cost prohibitive overkill.\\n\\n![Michael Ning](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-05.76d7cd3e.png&w=96&q=75)\\n\\nMichael Ning\\n\\n[](#)\\n\\nFirecrawl is impressive, saving us 2\/3 the tokens and allowing gpt3.5turbo use over gpt4. Major savings in time and money.\\n\\n![Alex Reibman \ud83d\udd87\ufe0f](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-06.4ee7cf5a.jpeg&w=96&q=75)\\n\\nAlex Reibman \ud83d\udd87\ufe0f\\n\\n[@AlexReibman](https:\/\/twitter.com\/AlexReibman\/status\/1780299595484131836)\\n\\nMoved our internal agent's web scraping tool from Apify to Firecrawl because it benchmarked 50x faster with AgentOps.\\n\\n![Michael](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-08.0bed40be.jpeg&w=96&q=75)\\n\\nMichael\\n\\n[@michael\\\\_chomsky](#)\\n\\nI really like some of the design decisions Firecrawl made, so I really want to share with others.\\n\\n![Paul Scott](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-09.d303b5b4.png&w=96&q=75)\\n\\nPaul Scott\\n\\n[@palebluepaul](https:\/\/twitter.com\/palebluepaul)\\n\\nAppreciating your lean approach, Firecrawl ticks off everything on our list without the cost prohibitive overkill.\\n\\nFlexible Pricing\\n----------------\\n\\nStart for free, then scale as you grow\\n\\nYearly (17% off)Yearly (2 months free)Monthly\\n\\nFree Plan\\n---------\\n\\n500 credits\\n\\n$0 one-time\\n\\nNo credit card requiredGet Started\\n\\n* Scrape 500 pages\\n* 10 \/scrape per min\\n* 1 \/crawl per min\\n\\nHobby\\n-----\\n\\n3,000 credits per month\\n\\n$16\/month\\n\\n$228\/yr$190\/yr (Billed annually)\\n\\nSubscribe$158\/yr\\n\\n* Scrape 3,000 pages\\\\*\\n* 20 \/scrape per min\\n* 3 \/crawl per min\\n\\nStandardMost Popular\\n--------------------\\n\\n100,000 credits per month\\n\\n$83\/month\\n\\n$1188\/yr$990\/yr (Billed annually)\\n\\nSubscribe$822\/yr\\n\\n* Scrape 100,000 pages\\\\*\\n* 100 \/scrape per min\\n* 10 \/crawl per min\\n* 2 seats\\n\\nGrowth\\n------\\n\\n500,000 credits per month\\n\\n$333\/month\\n\\n$4788\/yr$3990\/yr (Billed annually)\\n\\nSubscribe$3312\/yr\\n\\n* Scrape 500,000 pages\\\\*\\n* 1000 \/scrape per min\\n* 50 \/crawl per min\\n* 4 seats\\n* Priority Support\\n\\nEnterprise Plan\\n---------------\\n\\nUnlimited credits. Custom RPMs.\\n\\nTalk to us\\n\\n* Top priority support\\n* Feature Acceleration\\n* SLAs\\n* Account Manager\\n* Custom rate limits volume\\n* Custom concurrency limits\\n* Custom seats\\n* CEO's number\\n\\n\\\\* a \/scrape refers to the [scrape](https:\/\/docs.firecrawl.dev\/api-reference\/endpoint\/scrape)\\n API endpoint. Structured extraction costs vary. See [credits table](\/pricing#credits)\\n.\\n\\n\\\\* a \/crawl refers to the [crawl](https:\/\/docs.firecrawl.dev\/api-reference\/endpoint\/crawl)\\n API endpoint.\\n\\nAPI Credits\\n-----------\\n\\nCredits are consumed for each API request, varying by endpoint and feature.\\n\\n| Features | Credits |\\n| --- | --- |\\n| Scrape(\/scrape) | 1 \/ page |\\n| Crawl(\/crawl) | 1 \/ page |\\n| Map (\/map) | 1 \/ call |\\n| Search(\/search) | 1 \/ page |\\n| Scrape + LLM extraction (\/scrape) | 5 \/ page |\\n\\n[\ud83d\udd25](\/)\\n\\nReady to _Build?_\\n-----------------\\n\\nStart scraping web data for your AI apps today. \\nNo credit card needed.\\n\\n[Get Started](\/signin)\\n\\n[Talk to us](https:\/\/calendly.com\/d\/cj83-ngq-knk\/meet-firecrawl)\\n\\nFAQ\\n---\\n\\nFrequently asked questions about Firecrawl\\n\\n#### General\\n\\nWhat is Firecrawl?\\n\\nFirecrawl turns entire websites into clean, LLM-ready markdown or structured data. Scrape, crawl and extract the web with a single API. Ideal for AI companies looking to empower their LLM applications with web data.\\n\\nWhat sites work?\\n\\nFirecrawl is best suited for business websites, docs and help centers. We currently don't support social media platforms.\\n\\nWho can benefit from using Firecrawl?\\n\\nFirecrawl is tailored for LLM engineers, data scientists, AI researchers, and developers looking to harness web data for training machine learning models, market research, content aggregation, and more. It simplifies the data preparation process, allowing professionals to focus on insights and model development.\\n\\nIs Firecrawl open-source?\\n\\nYes, it is. You can check out the repository on GitHub. Keep in mind that this repository is currently in its early stages of development. We are in the process of merging custom modules into this mono repository.\\n\\nWhat is the difference between Firecrawl and other web scrapers?\\n\\nFirecrawl is designed with reliability and AI-ready data in mind. We focus on delivering data reliably and in a LLM-ready format - so you can spend less tokens and build better AI applications.\\n\\nWhat is the difference between the open-source version and the hosted version?\\n\\nFirecrawl's hosted version features Fire-engine which is our proprietary scraper that takes care of proxies, anti-bot mechanisms and more. It is an intelligent scraper designed to get the data you need - reliably. The hosted version also allows for actions (interacting with the page before scraping), a dashboard for analytics, and it is 1 API call away.\\n\\n#### Scraping & Crawling\\n\\nHow does Firecrawl handle dynamic content on websites?\\n\\nUnlike traditional web scrapers, Firecrawl is equipped to handle dynamic content rendered with JavaScript. It ensures comprehensive data collection from all accessible subpages, making it a reliable tool for scraping websites that rely heavily on JS for content delivery.\\n\\nWhy is it not crawling all the pages?\\n\\nThere are a few reasons why Firecrawl may not be able to crawl all the pages of a website. Some common reasons include rate limiting, and anti-scraping mechanisms, disallowing the crawler from accessing certain pages. If you're experiencing issues with the crawler, please reach out to our support team at help@firecrawl.com.\\n\\nCan Firecrawl crawl websites without a sitemap?\\n\\nYes, Firecrawl can access and crawl all accessible subpages of a website, even in the absence of a sitemap. This feature enables users to gather data from a wide array of web sources with minimal setup.\\n\\nWhat formats can Firecrawl convert web data into?\\n\\nFirecrawl specializes in converting web data into clean, well-formatted markdown. This format is particularly suited for LLM applications, offering a structured yet flexible way to represent web content.\\n\\nHow does Firecrawl ensure the cleanliness of the data?\\n\\nFirecrawl employs advanced algorithms to clean and structure the scraped data, removing unnecessary elements and formatting the content into readable markdown. This process ensures that the data is ready for use in LLM applications without further preprocessing.\\n\\nIs Firecrawl suitable for large-scale data scraping projects?\\n\\nAbsolutely. Firecrawl offers various pricing plans, including a Scale plan that supports scraping of millions of pages. With features like caching and scheduled syncs, it's designed to efficiently handle large-scale data scraping and continuous updates, making it ideal for enterprises and large projects.\\n\\nDoes it respect robots.txt?\\n\\nYes, Firecrawl crawler respects the rules set in a website's robots.txt file. If you notice any issues with the way Firecrawl interacts with your website, you can adjust the robots.txt file to control the crawler's behavior. Firecrawl user agent name is 'FirecrawlAgent'. If you notice any behavior that is not expected, please let us know at help@firecrawl.com.\\n\\nWhat measures does Firecrawl take to handle web scraping challenges like rate limits and caching?\\n\\nFirecrawl is built to navigate common web scraping challenges, including stealth proxies, rate limits, and smart wait. It smartly manages requests and employs techniques to minimize bandwidth usage and avoid triggering anti-scraping mechanisms, ensuring reliable data collection.\\n\\nDoes Firecrawl handle captcha or authentication?\\n\\nFirecrawl avoids captcha by using stealth proxies. When it encounters captcha, it attempts to solve it automatically, but this is not always possible. We are working to add support for more captcha solving methods. Firecrawl can handle authentication by providing auth headers to the API.\\n\\n#### API Related\\n\\nWhere can I find my API key?\\n\\nClick on the dashboard button on the top navigation menu when logged in and you will find your API key in the main screen and under API Keys.\\n\\n#### Billing\\n\\nIs Firecrawl free?\\n\\nFirecrawl is free for the first 500 scraped pages (500 free credits). After that, you can upgrade to our Standard or Growth plans for more credits and higher rate limits.\\n\\nIs there a pay per use plan instead of monthly?\\n\\nWe currently do notoffer a pay per use plan, instead you can upgrade to our Standard or Growth plans for more credits and higher rate limits.\\n\\nHow many credit does scraping, crawling, and extraction cost?\\n\\nScraping costs 1 credit per page. Crawling costs 1 credit per page. Check out the credits table in the pricing page for more details.\\n\\nDo you charge for failed requests (scrape, crawl, extract)?\\n\\nWe do not charge for any failed requests (scrape, crawl, extract). Please contact support at help@firecrawl.com if you have notice something wrong.\\n\\nWhat payment methods do you accept?\\n\\nWe accept payments through Stripe which accepts most major credit cards, debit cards, and PayPal.\",\"metadata\":{\"title\":\"Home - Firecrawl\",\"description\":\"Firecrawl crawls and converts any website into clean markdown.\",\"language\":\"en\",\"keywords\":\"Firecrawl,Markdown,Data,Mendable,Langchain\",\"robots\":\"follow, index\",\"ogTitle\":\"Firecrawl\",\"ogDescription\":\"Turn any website into LLM-ready data.\",\"ogUrl\":\"https:\/\/www.firecrawl.dev\/\",\"ogImage\":\"https:\/\/www.firecrawl.dev\/og.png?123\",\"ogLocaleAlternate\":[],\"ogSiteName\":\"Firecrawl\",\"viewport\":\"width=device-width, initial-scale=1\",\"author\":\"Firecrawl\",\"referrer\":\"origin-when-cross-origin\",\"creator\":\"Firecrawl\",\"publisher\":\"Firecrawl\",\"og:title\":\"Firecrawl\",\"og:description\":\"Turn any website into LLM-ready data.\",\"og:url\":\"https:\/\/www.firecrawl.dev\/\",\"og:site_name\":\"Firecrawl\",\"og:image\":\"https:\/\/www.firecrawl.dev\/og.png?123\",\"og:type\":\"website\",\"twitter:card\":\"summary_large_image\",\"twitter:site\":\"@vercel\",\"twitter:title\":\"Home - Firecrawl\",\"twitter:description\":\"Firecrawl crawls and converts any website into clean markdown.\",\"twitter:image\":\"https:\/\/www.firecrawl.dev\/og.png?123\",\"sourceURL\":\"https:\/\/www.firecrawl.dev\/\",\"sitemap\":{\"changefreq\":\"weekly\",\"lastmod\":\"2024-10-21T22:48:19.591Z\"},\"statusCode\":200}}}" + "data": "{\"success\":true,\"data\":{\"markdown\":\"Announcing Launch Week II - From 10\/28 to 11\/3 - [Check it out \ud83d\udd25](\/launch-week)\\n\\n[\ud83d\udca5 Get 2 months free with yearly plan](\/pricing)\\n\\nTurn websites into \\n_LLM-ready_ data\\n=====================================\\n\\nPower your AI apps with clean data crawled from any website. It's also open-source.\\n\\nStart for free (500 credits)Start for free[Talk to us](https:\/\/calendly.com\/d\/cj83-ngq-knk\/meet-firecrawl)\\n\\nA product by\\n\\n[![Mendable Logo](https:\/\/www.firecrawl.dev\/images\/mendable_logo_transparent.png)Mendable](https:\/\/mendable.ai)\\n\\n![Example Webpage](https:\/\/www.firecrawl.dev\/multiple-websites.png)\\n\\nCrawl, Scrape, Clean\\n--------------------\\n\\nWe crawl all accessible subpages and give you clean markdown for each. No sitemap required.\\n\\n \\n [\\\\\\n {\\\\\\n \\\"url\\\": \\\"https:\/\/www.firecrawl.dev\/\\\",\\\\\\n \\\"markdown\\\": \\\"## Welcome to Firecrawl\\\\\\n Firecrawl is a web scraper that allows you to extract the content of a webpage.\\\"\\\\\\n },\\\\\\n {\\\\\\n \\\"url\\\": \\\"https:\/\/www.firecrawl.dev\/features\\\",\\\\\\n \\\"markdown\\\": \\\"## Features\\\\\\n Discover how Firecrawl's cutting-edge features can \\\\\\n transform your data operations.\\\"\\\\\\n },\\\\\\n {\\\\\\n \\\"url\\\": \\\"https:\/\/www.firecrawl.dev\/pricing\\\",\\\\\\n \\\"markdown\\\": \\\"## Pricing Plans\\\\\\n Choose the perfect plan that fits your needs.\\\"\\\\\\n },\\\\\\n {\\\\\\n \\\"url\\\": \\\"https:\/\/www.firecrawl.dev\/about\\\",\\\\\\n \\\"markdown\\\": \\\"## About Us\\\\\\n Learn more about Firecrawl's mission and the \\\\\\n team behind our innovative platform.\\\"\\\\\\n }\\\\\\n ]\\n \\n\\nNote: The markdown has been edited for display purposes.\\n\\nTrusted by Top Companies\\n------------------------\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/zapier.png)](https:\/\/www.zapier.com)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/gamma.svg)](https:\/\/gamma.app)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/nvidia-com.png)](https:\/\/www.nvidia.com)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/teller-io.svg)](https:\/\/www.teller.io)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/stackai.svg)](https:\/\/www.stack-ai.com)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/palladiumdigital-co-uk.svg)](https:\/\/www.palladiumdigital.co.uk)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/worldwide-casting-com.svg)](https:\/\/www.worldwide-casting.com)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/open-gov-sg.png)](https:\/\/www.open.gov.sg)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/bain-com.svg)](https:\/\/www.bain.com)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/demand-io.svg)](https:\/\/www.demand.io)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/carrefour-logo-1.svg)](https:\/\/www.carrefour.com)\\n\\n[![Customer Logo](https:\/\/www.firecrawl.dev\/logos\/cyberagent-co-jp.svg)](https:\/\/www.cyberagent.co.jp)\\n\\nIntegrate today\\n---------------\\n\\nEnhance your applications with top-tier web scraping and crawling capabilities.\\n\\n#### Scrape\\n\\nExtract markdown or structured data from websites quickly and efficiently.\\n\\n#### Crawling\\n\\nNavigate and retrieve data from all accessible subpages, even without a sitemap.\\n\\n1\\n\\n2\\n\\n3\\n\\n4\\n\\n5\\n\\n6\\n\\n7\\n\\n8\\n\\n9\\n\\n10\\n\\n\/\/ npm install @mendable\/firecrawl-js \\n \\nimport FirecrawlApp from '@mendable\/firecrawl-js'; \\n \\nconst app \\\\= new FirecrawlApp({ apiKey: \\\"fc-YOUR\\\\_API\\\\_KEY\\\" }); \\n \\n\/\/ Scrape a website: \\nconst scrapeResult \\\\= await app.scrapeUrl('firecrawl.dev'); \\n \\nconsole.log(scrapeResult.data.markdown)\\n\\n#### Use well-known tools\\n\\nAlready fully integrated with the greatest existing tools and workflows.\\n\\n[![LlamaIndex](https:\/\/www.firecrawl.dev\/logos\/llamaindex.svg)](https:\/\/docs.llamaindex.ai\/en\/stable\/examples\/data_connectors\/WebPageDemo\/#using-firecrawl-reader\/)\\n[![Langchain](https:\/\/www.firecrawl.dev\/integrations\/langchain.png)](https:\/\/python.langchain.com\/v0.2\/docs\/integrations\/document_loaders\/firecrawl\/)\\n[![Dify](https:\/\/www.firecrawl.dev\/logos\/dify.png)](https:\/\/dify.ai\/blog\/dify-ai-blog-integrated-with-firecrawl\/)\\n[![Dify](https:\/\/www.firecrawl.dev\/integrations\/langflow_2.png)](https:\/\/www.langflow.org\/)\\n[![Flowise](https:\/\/www.firecrawl.dev\/integrations\/flowise.png)](https:\/\/flowiseai.com\/)\\n[![CrewAI](https:\/\/www.firecrawl.dev\/integrations\/crewai.png)](https:\/\/crewai.com\/)\\n\\n#### Start for free, scale easily\\n\\nKick off your journey for free and scale seamlessly as your project expands.\\n\\n[Try it out](\/signin\/signup)\\n\\n#### Open-source\\n\\nDeveloped transparently and collaboratively. Join our community of contributors.\\n\\n[Check out our repo](https:\/\/github.com\/mendableai\/firecrawl)\\n\\nWe handle the hard stuff\\n------------------------\\n\\nRotating proxies, orchestration, rate limits, js-blocked content and more\\n\\n#### Crawling\\n\\nFirecrawl crawls all accessible subpages, even without a sitemap.\\n\\n#### Dynamic content\\n\\nFirecrawl gathers data even if a website uses javascript to render content.\\n\\n#### To Markdown\\n\\nFirecrawl returns clean, well formatted markdown - ready for use in LLM applications\\n\\n#### Reliability first\\n\\nReliability is our core focus. Firecrawl is designed to ensure you get all the data you need.\\n\\n#### No Caching\\n\\nFirecrawl doesn't cache content by default. You always get the latest data.\\n\\n#### Built for AI\\n\\nBuilt by LLM engineers, for LLM engineers. Giving you clean data the way you want it.\\n\\n#### Smart Wait\\n\\nFirecrawl can intelligently wait for content to load, making scraping faster and more reliable.\\n\\n#### Actions\\n\\nClick, scroll, write, wait, press and more before extracting content.\\n\\n#### Media Parsing\\n\\nFirecrawl can parse and output clean content from web hosted pdfs, docx, images and more.\\n\\nOur wall of love\\n\\nDon't take our word for it\\n--------------------------\\n\\n![Greg Kamradt](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-02.0afeb750.jpg&w=96&q=75)\\n\\nGreg Kamradt\\n\\n[@GregKamradt](https:\/\/twitter.com\/GregKamradt\/status\/1780300642197840307)\\n\\nLLM structured data via API, handling requests, cleaning, and crawling. Enjoyed the early preview.\\n\\n![Amit Naik](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-03.ff5dbe11.jpg&w=96&q=75)\\n\\nAmit Naik\\n\\n[@suprgeek](https:\/\/twitter.com\/suprgeek\/status\/1780338213351035254)\\n\\n#llm success with RAG relies on Retrieval. Firecrawl by @mendableai structures web content for processing. \ud83d\udc4f\\n\\n![Jerry Liu](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-04.76bef0df.jpg&w=96&q=75)\\n\\nJerry Liu\\n\\n[@jerryjliu0](https:\/\/twitter.com\/jerryjliu0\/status\/1781122933349572772)\\n\\nFirecrawl is awesome \ud83d\udd25 Turns web pages into structured markdown for LLM apps, thanks to @mendableai.\\n\\n![Bardia Pourvakil](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-01.025350bc.jpeg&w=96&q=75)\\n\\nBardia Pourvakil\\n\\n[@thepericulum](https:\/\/twitter.com\/thepericulum\/status\/1781397799487078874)\\n\\nThese guys ship. I wanted types for their node SDK, and less than an hour later, I got them. Can't recommend them enough.\\n\\n![latentsauce \ud83e\uddd8\ud83c\udffd](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-07.c2285d35.jpeg&w=96&q=75)\\n\\nlatentsauce \ud83e\uddd8\ud83c\udffd\\n\\n[@latentsauce](https:\/\/twitter.com\/latentsauce\/status\/1781738253927735331)\\n\\nFirecrawl simplifies data preparation significantly, exactly what I was hoping for. Thank you for creating Firecrawl \u2764\ufe0f\u2764\ufe0f\u2764\ufe0f\\n\\n![Greg Kamradt](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-02.0afeb750.jpg&w=96&q=75)\\n\\nGreg Kamradt\\n\\n[@GregKamradt](https:\/\/twitter.com\/GregKamradt\/status\/1780300642197840307)\\n\\nLLM structured data via API, handling requests, cleaning, and crawling. Enjoyed the early preview.\\n\\n![Amit Naik](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-03.ff5dbe11.jpg&w=96&q=75)\\n\\nAmit Naik\\n\\n[@suprgeek](https:\/\/twitter.com\/suprgeek\/status\/1780338213351035254)\\n\\n#llm success with RAG relies on Retrieval. Firecrawl by @mendableai structures web content for processing. \ud83d\udc4f\\n\\n![Jerry Liu](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-04.76bef0df.jpg&w=96&q=75)\\n\\nJerry Liu\\n\\n[@jerryjliu0](https:\/\/twitter.com\/jerryjliu0\/status\/1781122933349572772)\\n\\nFirecrawl is awesome \ud83d\udd25 Turns web pages into structured markdown for LLM apps, thanks to @mendableai.\\n\\n![Bardia Pourvakil](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-01.025350bc.jpeg&w=96&q=75)\\n\\nBardia Pourvakil\\n\\n[@thepericulum](https:\/\/twitter.com\/thepericulum\/status\/1781397799487078874)\\n\\nThese guys ship. I wanted types for their node SDK, and less than an hour later, I got them. Can't recommend them enough.\\n\\n![latentsauce \ud83e\uddd8\ud83c\udffd](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-07.c2285d35.jpeg&w=96&q=75)\\n\\nlatentsauce \ud83e\uddd8\ud83c\udffd\\n\\n[@latentsauce](https:\/\/twitter.com\/latentsauce\/status\/1781738253927735331)\\n\\nFirecrawl simplifies data preparation significantly, exactly what I was hoping for. Thank you for creating Firecrawl \u2764\ufe0f\u2764\ufe0f\u2764\ufe0f\\n\\n![Michael Ning](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-05.76d7cd3e.png&w=96&q=75)\\n\\nMichael Ning\\n\\n[](#)\\n\\nFirecrawl is impressive, saving us 2\/3 the tokens and allowing gpt3.5turbo use over gpt4. Major savings in time and money.\\n\\n![Alex Reibman \ud83d\udd87\ufe0f](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-06.4ee7cf5a.jpeg&w=96&q=75)\\n\\nAlex Reibman \ud83d\udd87\ufe0f\\n\\n[@AlexReibman](https:\/\/twitter.com\/AlexReibman\/status\/1780299595484131836)\\n\\nMoved our internal agent's web scraping tool from Apify to Firecrawl because it benchmarked 50x faster with AgentOps.\\n\\n![Michael](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-08.0bed40be.jpeg&w=96&q=75)\\n\\nMichael\\n\\n[@michael\\\\_chomsky](#)\\n\\nI really like some of the design decisions Firecrawl made, so I really want to share with others.\\n\\n![Paul Scott](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-09.d303b5b4.png&w=96&q=75)\\n\\nPaul Scott\\n\\n[@palebluepaul](https:\/\/twitter.com\/palebluepaul)\\n\\nAppreciating your lean approach, Firecrawl ticks off everything on our list without the cost prohibitive overkill.\\n\\n![Michael Ning](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-05.76d7cd3e.png&w=96&q=75)\\n\\nMichael Ning\\n\\n[](#)\\n\\nFirecrawl is impressive, saving us 2\/3 the tokens and allowing gpt3.5turbo use over gpt4. Major savings in time and money.\\n\\n![Alex Reibman \ud83d\udd87\ufe0f](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-06.4ee7cf5a.jpeg&w=96&q=75)\\n\\nAlex Reibman \ud83d\udd87\ufe0f\\n\\n[@AlexReibman](https:\/\/twitter.com\/AlexReibman\/status\/1780299595484131836)\\n\\nMoved our internal agent's web scraping tool from Apify to Firecrawl because it benchmarked 50x faster with AgentOps.\\n\\n![Michael](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-08.0bed40be.jpeg&w=96&q=75)\\n\\nMichael\\n\\n[@michael\\\\_chomsky](#)\\n\\nI really like some of the design decisions Firecrawl made, so I really want to share with others.\\n\\n![Paul Scott](https:\/\/www.firecrawl.dev\/_next\/image?url=%2F_next%2Fstatic%2Fmedia%2Ftestimonial-09.d303b5b4.png&w=96&q=75)\\n\\nPaul Scott\\n\\n[@palebluepaul](https:\/\/twitter.com\/palebluepaul)\\n\\nAppreciating your lean approach, Firecrawl ticks off everything on our list without the cost prohibitive overkill.\\n\\nFlexible Pricing\\n----------------\\n\\nStart for free, then scale as you grow\\n\\nYearly (17% off)Yearly (2 months free)Monthly\\n\\nFree Plan\\n---------\\n\\n500 credits\\n\\n$0 one-time\\n\\nNo credit card requiredGet Started\\n\\n* Scrape 500 pages\\n* 10 \/scrape per min\\n* 1 \/crawl per min\\n\\nHobby\\n-----\\n\\n3,000 credits per month\\n\\n$16\/month\\n\\n$228\/yr$190\/yr (Billed annually)\\n\\nSubscribe$158\/yr\\n\\n* Scrape 3,000 pages\\\\*\\n* 20 \/scrape per min\\n* 3 \/crawl per min\\n\\nStandardMost Popular\\n--------------------\\n\\n100,000 credits per month\\n\\n$83\/month\\n\\n$1188\/yr$990\/yr (Billed annually)\\n\\nSubscribe$822\/yr\\n\\n* Scrape 100,000 pages\\\\*\\n* 100 \/scrape per min\\n* 10 \/crawl per min\\n* 2 seats\\n\\nGrowth\\n------\\n\\n500,000 credits per month\\n\\n$333\/month\\n\\n$4788\/yr$3990\/yr (Billed annually)\\n\\nSubscribe$3312\/yr\\n\\n* Scrape 500,000 pages\\\\*\\n* 1000 \/scrape per min\\n* 50 \/crawl per min\\n* 4 seats\\n* Priority Support\\n\\nAdd-ons\\n-------\\n\\n### Auto Recharge Credits\\n\\nAutomatically recharge your credits when you run low.\\n\\n$11per 1000 credits\\n\\nEnable Auto Recharge\\n\\nSubscribe to a plan to enable auto recharge\\n\\n### Credit Pack\\n\\nPurchase a pack of additional monthly credits.\\n\\n$9\/mo for 1000 credits\\n\\nPurchase Credit Pack\\n\\nSubscribe to a plan to purchase credit packs\\n\\nEnterprise Plan\\n---------------\\n\\nUnlimited credits. Custom RPMs.\\n\\nTalk to us\\n\\n* Top priority support\\n* Feature Acceleration\\n* SLAs\\n* Account Manager\\n* Custom rate limits volume\\n* Custom concurrency limits\\n* Custom seats\\n* CEO's number\\n\\n\\\\* a \/scrape refers to the [scrape](https:\/\/docs.firecrawl.dev\/api-reference\/endpoint\/scrape)\\n API endpoint. Structured extraction costs vary. See [credits table](\/pricing#credits)\\n.\\n\\n\\\\* a \/crawl refers to the [crawl](https:\/\/docs.firecrawl.dev\/api-reference\/endpoint\/crawl)\\n API endpoint.\\n\\nAPI Credits\\n-----------\\n\\nCredits are consumed for each API request, varying by endpoint and feature.\\n\\n| Features | Credits |\\n| --- | --- |\\n| Scrape(\/scrape) | 1 \/ page |\\n| Crawl(\/crawl) | 1 \/ page |\\n| Map (\/map) | 1 \/ call |\\n| Search(\/search) | 1 \/ page |\\n| Scrape + LLM extraction (\/scrape) | 5 \/ page |\\n\\n[\ud83d\udd25](\/)\\n\\nReady to _Build?_\\n-----------------\\n\\nStart scraping web data for your AI apps today. \\nNo credit card needed.\\n\\n[Get Started](\/signin)\\n\\n[Talk to us](https:\/\/calendly.com\/d\/cj83-ngq-knk\/meet-firecrawl)\\n\\nFAQ\\n---\\n\\nFrequently asked questions about Firecrawl\\n\\n#### General\\n\\nWhat is Firecrawl?\\n\\nFirecrawl turns entire websites into clean, LLM-ready markdown or structured data. Scrape, crawl and extract the web with a single API. Ideal for AI companies looking to empower their LLM applications with web data.\\n\\nWhat sites work?\\n\\nFirecrawl is best suited for business websites, docs and help centers. We currently don't support social media platforms.\\n\\nWho can benefit from using Firecrawl?\\n\\nFirecrawl is tailored for LLM engineers, data scientists, AI researchers, and developers looking to harness web data for training machine learning models, market research, content aggregation, and more. It simplifies the data preparation process, allowing professionals to focus on insights and model development.\\n\\nIs Firecrawl open-source?\\n\\nYes, it is. You can check out the repository on GitHub. Keep in mind that this repository is currently in its early stages of development. We are in the process of merging custom modules into this mono repository.\\n\\nWhat is the difference between Firecrawl and other web scrapers?\\n\\nFirecrawl is designed with reliability and AI-ready data in mind. We focus on delivering data reliably and in a LLM-ready format - so you can spend less tokens and build better AI applications.\\n\\nWhat is the difference between the open-source version and the hosted version?\\n\\nFirecrawl's hosted version features Fire-engine which is our proprietary scraper that takes care of proxies, anti-bot mechanisms and more. It is an intelligent scraper designed to get the data you need - reliably. The hosted version also allows for actions (interacting with the page before scraping), a dashboard for analytics, and it is 1 API call away.\\n\\n#### Scraping & Crawling\\n\\nHow does Firecrawl handle dynamic content on websites?\\n\\nUnlike traditional web scrapers, Firecrawl is equipped to handle dynamic content rendered with JavaScript. It ensures comprehensive data collection from all accessible subpages, making it a reliable tool for scraping websites that rely heavily on JS for content delivery.\\n\\nWhy is it not crawling all the pages?\\n\\nThere are a few reasons why Firecrawl may not be able to crawl all the pages of a website. Some common reasons include rate limiting, and anti-scraping mechanisms, disallowing the crawler from accessing certain pages. If you're experiencing issues with the crawler, please reach out to our support team at help@firecrawl.com.\\n\\nCan Firecrawl crawl websites without a sitemap?\\n\\nYes, Firecrawl can access and crawl all accessible subpages of a website, even in the absence of a sitemap. This feature enables users to gather data from a wide array of web sources with minimal setup.\\n\\nWhat formats can Firecrawl convert web data into?\\n\\nFirecrawl specializes in converting web data into clean, well-formatted markdown. This format is particularly suited for LLM applications, offering a structured yet flexible way to represent web content.\\n\\nHow does Firecrawl ensure the cleanliness of the data?\\n\\nFirecrawl employs advanced algorithms to clean and structure the scraped data, removing unnecessary elements and formatting the content into readable markdown. This process ensures that the data is ready for use in LLM applications without further preprocessing.\\n\\nIs Firecrawl suitable for large-scale data scraping projects?\\n\\nAbsolutely. Firecrawl offers various pricing plans, including a Scale plan that supports scraping of millions of pages. With features like caching and scheduled syncs, it's designed to efficiently handle large-scale data scraping and continuous updates, making it ideal for enterprises and large projects.\\n\\nDoes it respect robots.txt?\\n\\nYes, Firecrawl crawler respects the rules set in a website's robots.txt file. If you notice any issues with the way Firecrawl interacts with your website, you can adjust the robots.txt file to control the crawler's behavior. Firecrawl user agent name is 'FirecrawlAgent'. If you notice any behavior that is not expected, please let us know at help@firecrawl.com.\\n\\nWhat measures does Firecrawl take to handle web scraping challenges like rate limits and caching?\\n\\nFirecrawl is built to navigate common web scraping challenges, including stealth proxies, rate limits, and smart wait. It smartly manages requests and employs techniques to minimize bandwidth usage and avoid triggering anti-scraping mechanisms, ensuring reliable data collection.\\n\\nDoes Firecrawl handle captcha or authentication?\\n\\nFirecrawl avoids captcha by using stealth proxies. When it encounters captcha, it attempts to solve it automatically, but this is not always possible. We are working to add support for more captcha solving methods. Firecrawl can handle authentication by providing auth headers to the API.\\n\\n#### API Related\\n\\nWhere can I find my API key?\\n\\nClick on the dashboard button on the top navigation menu when logged in and you will find your API key in the main screen and under API Keys.\\n\\n#### Billing\\n\\nIs Firecrawl free?\\n\\nFirecrawl is free for the first 500 scraped pages (500 free credits). After that, you can upgrade to our Standard or Growth plans for more credits and higher rate limits.\\n\\nIs there a pay per use plan instead of monthly?\\n\\nWe currently do notoffer a pay per use plan, instead you can upgrade to our Standard or Growth plans for more credits and higher rate limits.\\n\\nHow many credit does scraping, crawling, and extraction cost?\\n\\nScraping costs 1 credit per page. Crawling costs 1 credit per page. Check out the credits table in the pricing page for more details.\\n\\nDo you charge for failed requests (scrape, crawl, extract)?\\n\\nWe do not charge for any failed requests (scrape, crawl, extract). Please contact support at help@firecrawl.com if you have notice something wrong.\\n\\nWhat payment methods do you accept?\\n\\nWe accept payments through Stripe which accepts most major credit cards, debit cards, and PayPal.\",\"metadata\":{\"title\":\"Home - Firecrawl\",\"description\":\"Firecrawl crawls and converts any website into clean markdown.\",\"language\":\"en\",\"keywords\":\"Firecrawl,Markdown,Data,Mendable,Langchain\",\"robots\":\"follow, index\",\"ogTitle\":\"Firecrawl\",\"ogDescription\":\"Turn any website into LLM-ready data.\",\"ogUrl\":\"https:\/\/www.firecrawl.dev\",\"ogImage\":\"https:\/\/www.firecrawl.dev\/og.png?123\",\"ogLocaleAlternate\":[],\"ogSiteName\":\"Firecrawl\",\"viewport\":\"width=device-width, initial-scale=1\",\"author\":\"Firecrawl\",\"referrer\":\"origin-when-cross-origin\",\"creator\":\"Firecrawl\",\"publisher\":\"Firecrawl\",\"og:title\":\"Firecrawl\",\"og:description\":\"Turn any website into LLM-ready data.\",\"og:url\":\"https:\/\/www.firecrawl.dev\",\"og:site_name\":\"Firecrawl\",\"og:image\":\"https:\/\/www.firecrawl.dev\/og.png?123\",\"og:type\":\"website\",\"twitter:card\":\"summary_large_image\",\"twitter:site\":\"@vercel\",\"twitter:title\":\"Home - Firecrawl\",\"twitter:description\":\"Firecrawl crawls and converts any website into clean markdown.\",\"twitter:image\":\"https:\/\/www.firecrawl.dev\/og.png?123\",\"sourceURL\":\"https:\/\/www.firecrawl.dev\/\",\"sitemap\":{\"changefreq\":\"weekly\",\"lastmod\":\"2024-10-25T20:17:46.663Z\"},\"statusCode\":200}}}" } diff --git a/tests/Fixtures/Saloon/Tools/SQLTestAgent-16ade5c7afd2bc82237a2c2c38ac43da.json b/tests/Fixtures/Saloon/Tools/SQLTestAgent-16ade5c7afd2bc82237a2c2c38ac43da.json deleted file mode 100644 index ae6c277..0000000 --- a/tests/Fixtures/Saloon/Tools/SQLTestAgent-16ade5c7afd2bc82237a2c2c38ac43da.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Sat, 12 Oct 2024 15:46:24 GMT", - "Content-Type": "application\/json", - "Content-Length": "1044", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AHYbvg2Z022Dp9J1lKpW8A7JyNBqe\",\n \"object\": \"chat.completion\",\n \"created\": 1728747983,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_C9LE4B5gWbExU1y747Hgs2wZ\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"query_s_q_l_data_base_tool\",\n \"arguments\": \"{\\\"query\\\":\\\"SELECT COUNT(*) AS Total_Organizations, AVG(funding_rounds) AS Average_Funding_Rounds FROM organizations WHERE status = 'operating'\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 298,\n \"completion_tokens\": 48,\n \"total_tokens\": 346,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/SQLTestAgent-17f20fbcbd7ad04b632e81d68f84cf54.json b/tests/Fixtures/Saloon/Tools/SQLTestAgent-17f20fbcbd7ad04b632e81d68f84cf54.json deleted file mode 100644 index 46a05cf..0000000 --- a/tests/Fixtures/Saloon/Tools/SQLTestAgent-17f20fbcbd7ad04b632e81d68f84cf54.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Sat, 12 Oct 2024 15:46:31 GMT", - "Content-Type": "application\/json", - "Content-Length": "786", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AHYc1C2fumsoLczurFDZ8Kuns7CRP\",\n \"object\": \"chat.completion\",\n \"created\": 1728747989,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"There are 100 organizations currently operating, and the average number of funding rounds for these organizations is 5.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1214,\n \"completion_tokens\": 34,\n \"total_tokens\": 1248,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/SQLTestAgent-3e0f0fd702de589714e68a3b90a2ac15.json b/tests/Fixtures/Saloon/Tools/SQLTestAgent-3e0f0fd702de589714e68a3b90a2ac15.json deleted file mode 100644 index 1c09674..0000000 --- a/tests/Fixtures/Saloon/Tools/SQLTestAgent-3e0f0fd702de589714e68a3b90a2ac15.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:29:23 GMT", - "Content-Type": "application\/json", - "Content-Length": "1044", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "1526", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999814", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "5ms", - "x-request-id": "req_2059b123e21a9db863f680b770278918", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=guVqR.qKuJyrWAcltjsK8jsZ16EItRlFsXa.ROQ3oUg-1729560563-1.0.1.1-q_oavJ0x_uuIj1MxntLxATA1dU3Dkzg7HzLm2Ndg4vOTnNyfPv1V8ZwEmF1mBPLDibmeuQAYLdbiXEN2M16FXQ; path=\/; expires=Tue, 22-Oct-24 01:59:23 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=xYJXGfv7beSxp_v.6fPQ4UGWnSZ86A3455lGlRorIw0-1729560563398-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b746f90d0ce1-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKy01tp4VAvOrPo24egK0NiQxcao6\",\n \"object\": \"chat.completion\",\n \"created\": 1729560561,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_TTyOgEachMKRBCv1QZhbOeaj\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"query_s_q_l_data_base_tool\",\n \"arguments\": \"{\\\"query\\\":\\\"SELECT COUNT(*) AS total_organizations, AVG(funding_rounds) AS average_funding_rounds FROM organizations WHERE status = 'operating'\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 345,\n \"completion_tokens\": 47,\n \"total_tokens\": 392,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Tools/SQLTestAgent-4bee15d63dcfd3b54ef6f5e689b0d57e.json b/tests/Fixtures/Saloon/Tools/SQLTestAgent-4bee15d63dcfd3b54ef6f5e689b0d57e.json deleted file mode 100644 index c65be21..0000000 --- a/tests/Fixtures/Saloon/Tools/SQLTestAgent-4bee15d63dcfd3b54ef6f5e689b0d57e.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Wed, 16 Oct 2024 22:30:08 GMT", - "Content-Type": "application\/json", - "Content-Length": "746", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AJ6omhwtFZhgwTJ9ymAXfWsCD8Ovh\",\n \"object\": \"chat.completion\",\n \"created\": 1729117804,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"There are 100 organizations operating with an average of 5 funding rounds each.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1214,\n \"completion_tokens\": 28,\n \"total_tokens\": 1242,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/SQLTestAgent-4c3078626dcfa6950ae2eb9ae69d71d9.json b/tests/Fixtures/Saloon/Tools/SQLTestAgent-4c3078626dcfa6950ae2eb9ae69d71d9.json deleted file mode 100644 index 72e9b88..0000000 --- a/tests/Fixtures/Saloon/Tools/SQLTestAgent-4c3078626dcfa6950ae2eb9ae69d71d9.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Sat, 12 Oct 2024 15:46:26 GMT", - "Content-Type": "application/json", - "Content-Length": "925", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AHYbyju4ZTcAQag0iGgiU4S6DD3gd\",\n \"object\": \"chat.completion\",\n \"created\": 1728747986,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_9ABiqHRAVvqiks60jaHYI9L7\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"info_s_q_l_database_tool\",\n \"arguments\": \"{\\\"tables\\\":\\\"organizations\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 414,\n \"completion_tokens\": 18,\n \"total_tokens\": 432,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_4dba7dd7b3\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/SQLTestAgent-5c0d5e203062af04810663fcedb6fcee.json b/tests/Fixtures/Saloon/Tools/SQLTestAgent-5c0d5e203062af04810663fcedb6fcee.json deleted file mode 100644 index 6035bb7..0000000 --- a/tests/Fixtures/Saloon/Tools/SQLTestAgent-5c0d5e203062af04810663fcedb6fcee.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Sat, 12 Oct 2024 15:46:22 GMT", - "Content-Type": "application/json", - "Content-Length": "897", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AHYbuZGSMw35f3TwaP1nMvPUvhNmK\",\n \"object\": \"chat.completion\",\n \"created\": 1728747982,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_3UbiicoV2jrxS6qtWp2H2X3X\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"list_s_q_l_database_tool\",\n \"arguments\": \"{}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 241,\n \"completion_tokens\": 14,\n \"total_tokens\": 255,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/SQLTestAgent-61990bddb088570835ac9679ebff1a34.json b/tests/Fixtures/Saloon/Tools/SQLTestAgent-61990bddb088570835ac9679ebff1a34.json deleted file mode 100644 index ebf94bc..0000000 --- a/tests/Fixtures/Saloon/Tools/SQLTestAgent-61990bddb088570835ac9679ebff1a34.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Wed, 16 Oct 2024 22:29:59 GMT", - "Content-Type": "application/json", - "Content-Length": "925", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AJ6ofbbJHNhxqlO8izo8PsfwQ2Dq5\",\n \"object\": \"chat.completion\",\n \"created\": 1729117797,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_jbH2d8t80nQjfpCQoeyPvbST\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"info_s_q_l_database_tool\",\n \"arguments\": \"{\\\"tables\\\":\\\"organizations\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 416,\n \"completion_tokens\": 18,\n \"total_tokens\": 434,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/SQLTestAgent-69088b2ddcf517d967507def8d0bc9e9.json b/tests/Fixtures/Saloon/Tools/SQLTestAgent-69088b2ddcf517d967507def8d0bc9e9.json deleted file mode 100644 index b584899..0000000 --- a/tests/Fixtures/Saloon/Tools/SQLTestAgent-69088b2ddcf517d967507def8d0bc9e9.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:29:29 GMT", - "Content-Type": "application\/json", - "Content-Length": "757", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "1176", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999094", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "27ms", - "x-request-id": "req_37a09ee5507aa155d015a29878bb4078", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=A9yzFLnE6kVi6.wlRB9qaJ1V41Qi1YGJ4SoCXQH6HNo-1729560569-1.0.1.1-YvvQydpUUtNfxrFAgbAu1DUjbuRuAkFOfkAyjIw1aWfv0Q0u6PtAN_tmYm5npzzDdEdqw97d1OHKTa_sZDn3jg; path=\/; expires=Tue, 22-Oct-24 01:59:29 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=Y83CCP2u_w9zGbMZ3ZZ6LiAbyxzaEMMhrzE6R2VLEgQ-1729560569590-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b76fcec017e9-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKy08fPRRCPOJll5zCiC9Tf9RgIvy\",\n \"object\": \"chat.completion\",\n \"created\": 1729560568,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"There are 100 organizations currently operating, with an average of 5 funding rounds each.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1257,\n \"completion_tokens\": 30,\n \"total_tokens\": 1287,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Tools/SQLTestAgent-6c936275667473da519c385ffd4d808c.json b/tests/Fixtures/Saloon/Tools/SQLTestAgent-6c936275667473da519c385ffd4d808c.json deleted file mode 100644 index 04bfffb..0000000 --- a/tests/Fixtures/Saloon/Tools/SQLTestAgent-6c936275667473da519c385ffd4d808c.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Sat, 12 Oct 2024 15:46:29 GMT", - "Content-Type": "application/json", - "Content-Length": "1050", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AHYbzWAqcQdUtpiRgQCj91a8MxLsO\",\n \"object\": \"chat.completion\",\n \"created\": 1728747987,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_HRfBVryYOnQu8uYZPZ6dePje\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"query_s_q_l_data_base_tool\",\n \"arguments\": \"{\\\"query\\\":\\\"SELECT COUNT(*) AS Total_Organizations, AVG(num_funding_rounds) AS Average_Funding_Rounds FROM organizations WHERE status = 'operating'\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1135,\n \"completion_tokens\": 49,\n \"total_tokens\": 1184,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/SQLTestAgent-78ec69527dda312ef75dea8aa1f07271.json b/tests/Fixtures/Saloon/Tools/SQLTestAgent-78ec69527dda312ef75dea8aa1f07271.json deleted file mode 100644 index 0506f31..0000000 --- a/tests/Fixtures/Saloon/Tools/SQLTestAgent-78ec69527dda312ef75dea8aa1f07271.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Wed, 16 Oct 2024 22:30:03 GMT", - "Content-Type": "application\/json", - "Content-Length": "1050", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AJ6ohb7t1RSh7SvJ80DTNFg1LmOEf\",\n \"object\": \"chat.completion\",\n \"created\": 1729117799,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_AK5VFPZ98VbxrxdUF054HRAs\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"query_s_q_l_data_base_tool\",\n \"arguments\": \"{\\\"query\\\":\\\"SELECT COUNT(*) as total_organizations, AVG(num_funding_rounds) as average_funding_rounds FROM organizations WHERE status = 'operating'\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1137,\n \"completion_tokens\": 48,\n \"total_tokens\": 1185,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/SQLTestAgent-abf1d4c9a9f535c0fbcb9eff86e94f08.json b/tests/Fixtures/Saloon/Tools/SQLTestAgent-abf1d4c9a9f535c0fbcb9eff86e94f08.json deleted file mode 100644 index d6fd204..0000000 --- a/tests/Fixtures/Saloon/Tools/SQLTestAgent-abf1d4c9a9f535c0fbcb9eff86e94f08.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:29:21 GMT", - "Content-Type": "application/json", - "Content-Length": "897", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "632", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999856", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "4ms", - "x-request-id": "req_56d8781ddcde5a717472de7255a7991f", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=yScYbZHL_Rd7LMBdTpqIYLccKSzl1rlP5zEzZgjGq3Y-1729560561-1.0.1.1-ZFJrMkEq2vNiXa5YjLYUMEEAmr72W7Gj2ujOu4699wkYYbI5scdPcP0grtI10lvMPQJWdM5FxH.0YyFeWrAtew; path=/; expires=Tue, 22-Oct-24 01:59:21 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=yDuONGmF_ychELOKioHUiji5lE8KMuWVkYMzCG979FM-1729560561339-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b73f89834326-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKy001GD1R3IFY492fC5V4tIRqf04\",\n \"object\": \"chat.completion\",\n \"created\": 1729560560,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_fOZCSDVshke9wStxQAoXXOE2\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"list_s_q_l_database_tool\",\n \"arguments\": \"{}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 284,\n \"completion_tokens\": 14,\n \"total_tokens\": 298,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/SQLTestAgent-e3b7bce01bc7df21e79bf8c5c7fbf744.json b/tests/Fixtures/Saloon/Tools/SQLTestAgent-e3b7bce01bc7df21e79bf8c5c7fbf744.json deleted file mode 100644 index af5e86a..0000000 --- a/tests/Fixtures/Saloon/Tools/SQLTestAgent-e3b7bce01bc7df21e79bf8c5c7fbf744.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:29:28 GMT", - "Content-Type": "application/json", - "Content-Length": "1050", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "2142", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999110", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "26ms", - "x-request-id": "req_50e972e2d459ebad8d8b2efc671b393d", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=09n047pzK1ARvDHZPk2f0N5N_VdzPp0t7ZvFNdA1.mo-1729560568-1.0.1.1-ZNsGq9Vnotn9x1yolzrlh4y1tEpKaNzhtfv9Oq_p5_gBcm_AXnlYCF.3Yak2kBu_upwxALCausj4oCiw7fjZKQ; path=/; expires=Tue, 22-Oct-24 01:59:28 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=dAOMJBz_uESCqPJqSTnOfjZDmF8LDId7aGFeu4CLfWI-1729560568037-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b7601da68cc8-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKy053cRiePzZPxxhOhoBpyz1t7R4\",\n \"object\": \"chat.completion\",\n \"created\": 1729560565,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_Yx8Chp7MvDVisrQT9QKYL1na\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"query_s_q_l_data_base_tool\",\n \"arguments\": \"{\\\"query\\\":\\\"SELECT COUNT(*) AS total_organizations, AVG(num_funding_rounds) AS average_funding_rounds FROM organizations WHERE status = 'operating'\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1180,\n \"completion_tokens\": 48,\n \"total_tokens\": 1228,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/SQLTestAgent-e8159268c7e07a723f5966bd56d71812.json b/tests/Fixtures/Saloon/Tools/SQLTestAgent-e8159268c7e07a723f5966bd56d71812.json deleted file mode 100644 index 3669707..0000000 --- a/tests/Fixtures/Saloon/Tools/SQLTestAgent-e8159268c7e07a723f5966bd56d71812.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:29:25 GMT", - "Content-Type": "application\/json", - "Content-Length": "925", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "1688", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999756", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "7ms", - "x-request-id": "req_1d896cac3b2f36a11d63050f0744a671", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=kjd46MXC4gZrZJbsCCK3en9OCtrGlZMIV3P7UO7fLWk-1729560565-1.0.1.1-sB5B.Ax3jmsAzGtlT_ZYH27YHwwnL96egOpsOQ2wc8SaGD2cmW.OGSEpUop_jNshPIl5oR_iWRI9al66DrukrQ; path=\/; expires=Tue, 22-Oct-24 01:59:25 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=fXHmS2G3edYEejtHbzQySiss4wDMDKvYOgfnUiaXn6Q-1729560565521-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b7533d0272c2-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKy03kK87akDyLYbbJuDqrhHSx0R4\",\n \"object\": \"chat.completion\",\n \"created\": 1729560563,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_5Hxryd7lM0K79EMz6cTdEKC9\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"info_s_q_l_database_tool\",\n \"arguments\": \"{\\\"tables\\\":\\\"organizations\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 459,\n \"completion_tokens\": 18,\n \"total_tokens\": 477,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Tools/SQLTestAgent-fd2cd6d73785dc8bae6e230fd57c4dd7.json b/tests/Fixtures/Saloon/Tools/SQLTestAgent-fd2cd6d73785dc8bae6e230fd57c4dd7.json deleted file mode 100644 index b6ac2d6..0000000 --- a/tests/Fixtures/Saloon/Tools/SQLTestAgent-fd2cd6d73785dc8bae6e230fd57c4dd7.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Wed, 16 Oct 2024 22:29:54 GMT", - "Content-Type": "application\/json", - "Content-Length": "1044", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "3660", - "openai-version": "2020-10-01" - }, - "data": "{\n \"id\": \"chatcmpl-AJ6oYLoBB7TZNFedUf9dVYg1tU6ZT\",\n \"object\": \"chat.completion\",\n \"created\": 1729117790,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_hJZqVBM0g5QzyroXcz8asyfv\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"query_s_q_l_data_base_tool\",\n \"arguments\": \"{\\\"query\\\":\\\"SELECT COUNT(*) as total_organizations, AVG(funding_rounds) as average_funding_rounds FROM organizations WHERE status = 'operating'\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 302,\n \"completion_tokens\": 47,\n \"total_tokens\": 349,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-3ca51b450f65fd56079ce1db68405384.json b/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-3ca51b450f65fd56079ce1db68405384.json deleted file mode 100644 index 81c1c9e..0000000 --- a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-3ca51b450f65fd56079ce1db68405384.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:29:47 GMT", - "Content-Type": "application/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "15503", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1993944", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "181ms", - "x-request-id": "req_b28823223838ac9fe8e69d5305c1b36a", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=aCCfAOS5xf0lUlwFIpj6oIBEMZ7u5UklTIjGKX4VWLc-1729560587-1.0.1.1-WXF.mGTeHhf3ncnnaWPM9RAVkcEUMBNQZ0KY238Dy1COFW3AKLs0Rs8OGWh5PlZEI0EHGfN1anPU66RyyI9ULg; path=/; expires=Tue, 22-Oct-24 01:59:47 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=I7wUOmNBlQg7QrAzXx24GwbiCEBKJtdobXTPllfKYPg-1729560587513-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b7860d318c54-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKy0CIR6qrXS1HLjvd7OsRNZlio4S\",\n \"object\": \"chat.completion\",\n \"created\": 1729560572,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": [\\n {\\n \\\"title\\\": \\\"Apple MacBook Air M4: news, rumors, and everything we know\\\",\\n \\\"date\\\": \\\"10/04/2024\\\",\\n \\\"link\\\": \\\"https://www.techradar.com/computing/macbooks/macbook-air-m4\\\"\\n },\\n {\\n \\\"title\\\": \\\"Apple Intelligence to boost iPhone 16 series sales: Analysts\\\",\\n \\\"date\\\": \\\"10/04/2024\\\",\\n \\\"link\\\": \\\"https://www.androidheadlines.com/2024/10/apple-intelligence-to-boost-iphone-16-series-sales-analysts.html\\\"\\n },\\n {\\n \\\"title\\\": \\\"Thursday\u2019s Headlines: Apples and Honey and Game 3 Edition\\\",\\n \\\"date\\\": \\\"10/03/2024\\\",\\n \\\"link\\\": \\\"https://nyc.streetsblog.org/2024/10/03/thursdays-headlines-apples-and-honey-and-game-3-edition\\\"\\n },\\n {\\n \\\"title\\\": \\\"NYC buses tout Big Flavor in The Big Apple\\\",\\n \\\"date\\\": \\\"10/03/2024\\\",\\n \\\"link\\\": \\\"https://theproducenews.com/headlines/nyc-buses-tout-big-flavor-big-apple\\\"\\n },\\n {\\n \\\"title\\\": \\\"First iOS 18 and iPadOS 18 patches fix serious bugs\\\",\\n \\\"date\\\": \\\"10/03/2024\\\",\\n \\\"link\\\": \\\"https://www.cultofmac.com/news/ios-18-0-1-ipados-macos-sequoia-15-0-1-patches-fix-serious-bugs\\\"\\n },\\n {\\n \\\"title\\\": \\\"'Tastes are changing so rapidly': Biting into the Western New York apple market\\\",\\n \\\"date\\\": \\\"10/01/2024\\\",\\n \\\"link\\\": \\\"https://www.wkbw.com/news/local-news/niagara-orleans/tastes-are-changing-rapidly-biting-into-the-wny-apple-market\\\"\\n },\\n {\\n \\\"title\\\": \\\"These five Apple products will likely be discontinued next month\\\",\\n \\\"date\\\": \\\"09/28/2024\\\",\\n \\\"link\\\": \\\"https://9to5mac.com/2024/09/28/apple-discontinuing-products-october/\\\"\\n },\\n {\\n \\\"title\\\": \\\"Apple possibly cuts Q4 iPhone 16 builds by 3M: Barclays\\\",\\n \\\"date\\\": \\\"10/01/2024\\\",\\n \\\"link\\\": \\\"https://seekingalpha.com/news/4154936-apple-possibly-cuts-q4-iphone-16-builds-by-3m-barclays\\\"\\n }\\n ]\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 8015,\n \"completion_tokens\": 567,\n \"total_tokens\": 8582,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_83975a045a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-8b5a265c43dea6f4ed40a3d21bd13bf1.json b/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-8b5a265c43dea6f4ed40a3d21bd13bf1.json deleted file mode 100644 index 819f2c6..0000000 --- a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-8b5a265c43dea6f4ed40a3d21bd13bf1.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:29:31 GMT", - "Content-Type": "application\/json", - "Content-Length": "929", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "1293", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999869", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "3ms", - "x-request-id": "req_8923e9fd27fdf4c71c793871bb1e7728", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=kpMEZlG9LXuUY7.KeKSdeRYEXv8A3zzF52Yawk0n9iY-1729560571-1.0.1.1-RpHwS3B6cX2zMPV6RXNAlm5SNYR6770etyc007R12TzIiVXrbvBqWOESUig3FoKxKHnWBPAVMv1sKrQtWfXUIA; path=\/; expires=Tue, 22-Oct-24 01:59:31 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=irhipbpfUKI6EJeYDSNkQG1M3ohGDv6GaASL3TO5pME-1729560571556-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b77b6e5b43dc-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKy0APamYmgS1VTadZJi7C5FrEqqP\",\n \"object\": \"chat.completion\",\n \"created\": 1729560570,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_V5KWoIiGuHXsVshlA3A7dNa7\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"serp_a_p_i_google_news_tool\",\n \"arguments\": \"{\\\"query\\\":\\\"Apple headlines\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 154,\n \"completion_tokens\": 21,\n \"total_tokens\": 175,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-937c344a3cba8d7375b74873e978e987.json b/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-937c344a3cba8d7375b74873e978e987.json deleted file mode 100644 index 0395e82..0000000 --- a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-937c344a3cba8d7375b74873e978e987.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Fri, 04 Oct 2024 13:28:33 GMT", - "Content-Type": "application/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "4088", - "openai-version": "2020-10-01", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1993988", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "180ms", - "x-request-id": "req_ea42ec3d15659e1c1a94b84479735987", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=nRsufRrCFkJUU6rNZE.aPGWq4pGGJC_gR5Kgnxa6Z0s-1728048513-1.0.1.1-FwbSn2ZUlNEr617jDYTAh3SFbQADepnLXOPySrvAgjnaGp7voeN9KRuZdDXSr0MEaVYiZRmhlFSrIBWfv3gceQ; path=/; expires=Fri, 04-Oct-24 13:58:33 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=9PBmduC0guXvwA05WGlLVeA7n9UPCtlik5giG6TpWps-1728048513055-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8cd583eb291f72b1-EWR" - }, - "data": "{\n \"id\": \"chatcmpl-AEce5UHMf7CttxNj4cAUtUVtceBGU\",\n \"object\": \"chat.completion\",\n \"created\": 1728048509,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"answer\\\": \\\"Recent headlines about Apple include news on the expected discontinuation of some Apple products next month, the debut of macOS, iPadOS, and watchOS updates, and details on the newly unveiled iPhone 16 at the 'Glowtime' event. There are also updates on the rumored iPhone SE 4 with Apple A18 SoC, and speculations about Apple potentially cutting Q4 iPhone 16 builds.\\\"\\n}\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 7980,\n \"completion_tokens\": 89,\n \"total_tokens\": 8069,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_68a5bb159e\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-9aaf34285a5c2c42a794174131d55815.json b/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-9aaf34285a5c2c42a794174131d55815.json deleted file mode 100644 index a1504cf..0000000 --- a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-9aaf34285a5c2c42a794174131d55815.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Fri, 04 Oct 2024 13:28:26 GMT", - "Content-Type": "application\/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "727", - "openai-version": "2020-10-01", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999914", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "2ms", - "x-request-id": "req_fb4ecdc6356f20e6a9f8b07cf25589ef", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=hNgbfiooKjFS8FEPIvnJTD9odY7xPbvQsLpTqbX_iFA-1728048506-1.0.1.1-kQfwQat5tvtn0Z4wzRsvziYS1iizhdxiWjieAjH9QQB.X7wQ0nrhNoxd6eGLb3Zlt7LH9hCfL3zWn_S2BLhWsQ; path=\/; expires=Fri, 04-Oct-24 13:58:26 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=UPyB9m5qEFghaS7msF4J0RqK5oDvaxDmZrFk58yk588-1728048506366-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8cd583d6db84426a-EWR" - }, - "data": "{\n \"id\": \"chatcmpl-AEce1yUvyLgLRPVxbG50zwZCm73vH\",\n \"object\": \"chat.completion\",\n \"created\": 1728048505,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_dW1jrvJFqLQayxfkIEwV5oZm\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"serp_a_p_i_google_news_tool\",\n \"arguments\": \"{\\\"query\\\":\\\"Apple headlines\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 119,\n \"completion_tokens\": 21,\n \"total_tokens\": 140,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_81dd8129df\"\n}\n" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-Tool.json b/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-Tool.json deleted file mode 100644 index e6654e1..0000000 --- a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-Tool.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Fri, 04 Oct 2024 13:28:28 GMT", - "Content-Type": "application\/json; charset=utf-8", - "Content-Length": "69743", - "Connection": "keep-alive", - "x-frame-options": "SAMEORIGIN", - "x-xss-protection": "1; mode=block", - "x-content-type-options": "nosniff", - "x-download-options": "noopen", - "x-permitted-cross-domain-policies": "none", - "referrer-policy": "strict-origin-when-cross-origin", - "x-robots-tag": "noindex, nofollow", - "serpapi-search-id": "66ffed7aa775f2cd03f714cb", - "cache-control": "max-age=3600, public", - "etag": "W\/\"7ac6bd4b1832494375f330d7a0320484\"", - "x-request-id": "3cf71008-7044-4c32-934a-f856fa0f5490", - "x-runtime": "1.960136", - "CF-Cache-Status": "MISS", - "Accept-Ranges": "bytes", - "Server": "cloudflare", - "CF-RAY": "8cd583ddaff70fa4-EWR" - }, - "data": "{\n \"search_metadata\": {\n \"id\": \"66ffed7aa775f2cd03f714cb\",\n \"status\": \"Success\",\n \"json_endpoint\": \"https:\/\/serpapi.com\/searches\/a2a0f682cef54f6c\/66ffed7aa775f2cd03f714cb.json\",\n \"created_at\": \"2024-10-04 13:28:26 UTC\",\n \"processed_at\": \"2024-10-04 13:28:26 UTC\",\n \"google_news_url\": \"https:\/\/news.google.com\/search?q=Apple+headlines\",\n \"raw_html_file\": \"https:\/\/serpapi.com\/searches\/a2a0f682cef54f6c\/66ffed7aa775f2cd03f714cb.html\",\n \"total_time_taken\": 1.88\n },\n \"search_parameters\": {\n \"engine\": \"google_news\",\n \"q\": \"Apple headlines\"\n },\n \"news_results\": [\n {\n \"position\": 1,\n \"title\": \"Apple MacBook Air M4: news, rumors, and everything we know\",\n \"source\": {\n \"name\": \"TechRadar\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/h3jba9VMZkFHG1QVakElUh94ugAfWEJfnBwg-v1YYuGEsB7Xo0Na9-1HSp2RTIvArgKT-D_A5g\",\n \"authors\": [\n \"Allisa James\"\n ]\n },\n \"link\": \"https:\/\/www.techradar.com\/computing\/macbooks\/macbook-air-m4\",\n \"thumbnail\": \"https:\/\/cdn.mos.cms.futurecdn.net\/YMV9guZan663h45mX9uAiW-1200-80.jpg\",\n \"date\": \"10\/04\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 2,\n \"title\": \"Apple Intelligence to boost iPhone 16 series sales: Analysts\",\n \"source\": {\n \"name\": \"Android Headlines\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/eEXS3spaZZb8YklkgzyzVCR6F1Kz1HP46ATKcfjCJju06flKjiA8oekf5a_0yMkGz5r45Zv1GQ\",\n \"authors\": [\n \"Kristijan Lucic\"\n ]\n },\n \"link\": \"https:\/\/www.androidheadlines.com\/2024\/10\/apple-intelligence-to-boost-iphone-16-series-sales-analysts.html\",\n \"thumbnail\": \"https:\/\/www.androidheadlines.com\/wp-content\/uploads\/2024\/09\/iPhone-16-Apple-Intelligence-videos-featured.webp\",\n \"date\": \"10\/04\/2024, 12:15 PM, +0000 UTC\"\n },\n {\n \"position\": 3,\n \"title\": \"Thursday\u2019s Headlines: Apples and Honey and Game 3 Edition\",\n \"source\": {\n \"name\": \"Streetsblog New York City\",\n \"icon\": \"https:\/\/encrypted-tbn2.gstatic.com\/faviconV2?url=https:\/\/nyc.streetsblog.org&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\",\n \"authors\": [\n \"Gersh Kuntzman\"\n ]\n },\n \"link\": \"https:\/\/nyc.streetsblog.org\/2024\/10\/03\/thursdays-headlines-apples-and-honey-and-game-3-edition\",\n \"thumbnail\": \"https:\/\/lede-admin.nyc.streetsblog.org\/wp-content\/uploads\/sites\/48\/2024\/10\/mets-apples-and-honey-copy.jpg\",\n \"date\": \"10\/03\/2024, 04:01 AM, +0000 UTC\"\n },\n {\n \"position\": 4,\n \"title\": \"NYC buses tout Big Flavor in The Big Apple\",\n \"source\": {\n \"name\": \"The Produce News\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/wuub-wDJCPPgnapHs_ugjjQqBJndZvj7tMby7GC68PvPfNHvKM8WzvOfU9H6X9NYAXEBG_L4\"\n },\n \"link\": \"https:\/\/theproducenews.com\/headlines\/nyc-buses-tout-big-flavor-big-apple\",\n \"thumbnail\": \"https:\/\/theproducenews.com\/sites\/default\/files\/2024-10\/big_0.jpg\",\n \"date\": \"10\/03\/2024, 05:22 PM, +0000 UTC\"\n },\n {\n \"position\": 5,\n \"title\": \"First iOS 18 and iPadOS 18 patches fix serious bugs\",\n \"source\": {\n \"name\": \"Cult of Mac\",\n \"icon\": \"https:\/\/encrypted-tbn2.gstatic.com\/faviconV2?url=https:\/\/www.cultofmac.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\",\n \"authors\": [\n \"Ed Hardy\"\n ]\n },\n \"link\": \"https:\/\/www.cultofmac.com\/news\/ios-18-0-1-ipados-macos-sequoia-15-0-1-patches-fix-serious-bugs\",\n \"thumbnail\": \"https:\/\/www.cultofmac.com\/wp-content\/uploads\/2024\/10\/iOS-18-0-1-iPhone-patch.jpg\",\n \"date\": \"10\/03\/2024, 10:22 PM, +0000 UTC\"\n },\n {\n \"position\": 6,\n \"title\": \"'Tastes are changing so rapidly': Biting into the Western New York apple market\",\n \"source\": {\n \"name\": \"WKBW 7 News Buffalo\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/HGPE25JOhbEj3RXOj_zPEIQ6Y3udEIZBbCxJXZkQ2OsnoRsjKdWthaCTKmAnnCJzn9DdvYBZ0_w\",\n \"authors\": [\n \"Jaurdyn Johnson\"\n ]\n },\n \"link\": \"https:\/\/www.wkbw.com\/news\/local-news\/niagara-orleans\/tastes-are-changing-rapidly-biting-into-the-wny-apple-market\",\n \"thumbnail\": \"https:\/\/x-default-stgec.uplynk.com\/ause\/slices\/7b3\/1020d6d1597347248f5d62c059a4c7e3\/7b38fc681f45437c8b22f0c4cf2a7c3e\/poster_395e44f0353149cdaa3360526cdaa2e4.png\",\n \"date\": \"10\/01\/2024, 10:22 PM, +0000 UTC\"\n },\n {\n \"position\": 7,\n \"title\": \"These five Apple products will likely be discontinued next month\",\n \"source\": {\n \"name\": \"9to5Mac\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/_yU7TVFBBY59lFTGF_gB-G6AZql5gRMNflxhEDwVjLtWfN6Xh6JPnPNqKAJO75h_BLghOkzYPw\",\n \"authors\": [\n \"Michael Burkhardt\"\n ]\n },\n \"link\": \"https:\/\/9to5mac.com\/2024\/09\/28\/apple-discontinuing-products-october\/\",\n \"thumbnail\": \"https:\/\/9to5mac.com\/wp-content\/uploads\/sites\/6\/2024\/07\/apple-device-lineup.jpg?quality=82&strip=all&w=1600\",\n \"date\": \"09\/28\/2024, 06:06 PM, +0000 UTC\"\n },\n {\n \"position\": 8,\n \"title\": \"Apple possibly cuts Q4 iPhone 16 builds by 3M: Barclays\",\n \"source\": {\n \"name\": \"Seeking Alpha\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/-AuHkF7hb4isLMc4bLhcnlm659w_XJ47Fpzr3Zllk7uXpuSuSOuj7f89tXfFkYLzol580OROWQ\",\n \"authors\": [\n \"Brandon Evans\"\n ]\n },\n \"link\": \"https:\/\/seekingalpha.com\/news\/4154936-apple-possibly-cuts-q4-iphone-16-builds-by-3m-barclays\",\n \"thumbnail\": \"https:\/\/static.seekingalpha.com\/cdn\/s3\/uploads\/getty_images\/1342200877\/image_1342200877.jpg?io=getty-c-w750\",\n \"date\": \"10\/01\/2024, 12:38 PM, +0000 UTC\"\n },\n {\n \"position\": 9,\n \"title\": \"Apple rolls out new macOS, iPadOS & watchOS updates\",\n \"source\": {\n \"name\": \"Android Headlines\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/eEXS3spaZZb8YklkgzyzVCR6F1Kz1HP46ATKcfjCJju06flKjiA8oekf5a_0yMkGz5r45Zv1GQ\",\n \"authors\": [\n \"Rishaj Upadhyay\"\n ]\n },\n \"link\": \"https:\/\/www.androidheadlines.com\/2024\/10\/apple-macos-ipados-watchos-new-updates.html\",\n \"thumbnail\": \"https:\/\/www.androidheadlines.com\/wp-content\/uploads\/2023\/04\/best-apple-watch-bands-AM-AH-1420x1065.webp\",\n \"date\": \"10\/04\/2024, 11:25 AM, +0000 UTC\"\n },\n {\n \"position\": 10,\n \"title\": \"Apple Event Live Blog: All the iPhone 16 News as It Happens\",\n \"source\": {\n \"name\": \"WIRED\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/glGHGpbYzksKAWY0zPxk7YYJrqE5FF5dALI27SaNZaeqEoUhgEUH4vo_DX00DRdkEjcVJCQkmNA\"\n },\n \"link\": \"https:\/\/www.wired.com\/live\/apple-event-live-blog-iphone-16-apple-watch-series-10\/\",\n \"thumbnail\": \"https:\/\/media.wired.com\/photos\/66db72107aee34945bc8d711\/master\/w_1280%2Cc_limit\/AppleEvent-Sep2024-Live-Blog-GEAR-2156429444.jpg\",\n \"date\": \"09\/09\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 11,\n \"title\": \"Apple Loop: Faster iPhone 17 Leaks, Disappointing iPhone 16 Pro Sales, Critical iOS Update\",\n \"source\": {\n \"name\": \"Forbes\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/NIjzR9QHtZJllEvJIVkODXFQ7_rbx1BMBXx2rNUbttjuu9YWLIp2_juQaI9jJ2rDtzi6snbZ\",\n \"authors\": [\n \"Ewan Spence\"\n ]\n },\n \"link\": \"https:\/\/www.forbes.com\/sites\/ewanspence\/2024\/09\/27\/apple-news-headlines-iphone-17-leak-iphone-16-pro-sales-ios-18-problems\/\",\n \"thumbnail\": \"https:\/\/imageio.forbes.com\/specials-images\/imageserve\/66f6f1e6e0a0a1e965def862\/Largest-Apple-Flagship-Store-in-Asia\/960x0.jpg?height=473&width=711&fit=bounds\",\n \"date\": \"09\/27\/2024, 08:15 PM, +0000 UTC\"\n },\n {\n \"position\": 12,\n \"title\": \"Apple's new iPhone 16 unveiled at \\\"Glowtime\\\" event\",\n \"source\": {\n \"name\": \"CBS News\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/dXy0k7AMf-wXfnj2AtaLk3rZcPGjClkFvKSAQnjoLp9wa_ggxST_WSGqovh984zY8mf3vDmt\",\n \"authors\": [\n \"Megan Cerullo\"\n ]\n },\n \"link\": \"https:\/\/www.cbsnews.com\/news\/apple-iphone-16-event-its-glowtime\/\",\n \"thumbnail\": \"https:\/\/assets2.cbsnewsstatic.com\/hub\/i\/r\/2024\/09\/09\/128cd6e9-3b69-4b35-92b7-5d129fd16427\/thumbnail\/1200x630\/487b1ef616f9f1845fc8c287c08d588b\/apple-iphone-16-pro-finish-lineup-240909.jpg?v=0736ad3ef1e9ddfe1218648fe91d6c9b\",\n \"date\": \"09\/23\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 13,\n \"title\": \"I\u2019m starting to get really worried about Apple Intelligence on the iPhone 16\",\n \"source\": {\n \"name\": \"BGR\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/4FsrisEYLJxNnxAnGn44Oy89qtkBbFouAm47vtzzczHq_8EwiA8EnrB6zBc5XvYkOBLjA35O0bI\",\n \"authors\": [\n \"Chris Smith\"\n ]\n },\n \"link\": \"https:\/\/bgr.com\/tech\/im-starting-to-get-really-worried-about-apple-intelligence-on-the-iphone-16\/\",\n \"thumbnail\": \"https:\/\/bgr.com\/wp-content\/uploads\/2024\/09\/Apple-iPhone-16-Apple-Intelligence-240909.jpg?quality=82&strip=all&w=1020&h=574&crop=1\",\n \"date\": \"09\/27\/2024, 01:02 PM, +0000 UTC\"\n },\n {\n \"position\": 14,\n \"title\": \"Apple launches iPhone 16 with Apple Intelligence\",\n \"source\": {\n \"name\": \"Yahoo Finance\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/L57n4HUzUS8lNXBPYNGQScsyxaqqx42Nym3-tUk8NzkTvMsa95NhzEqC8KMqVPFpAFpCuPFdlA\",\n \"authors\": [\n \"Daniel Howley\"\n ]\n },\n \"link\": \"https:\/\/finance.yahoo.com\/news\/apple-launches-iphone-16-with-apple-intelligence-183724722.html\",\n \"thumbnail\": \"https:\/\/s.yimg.com\/ny\/api\/res\/1.2\/GZtaAoU8xOco42u2pBSQFA--\/YXBwaWQ9aGlnaGxhbmRlcjt3PTEyMDA7aD02NzU-\/https:\/\/s.yimg.com\/os\/creatr-uploaded-images\/2024-09\/6c3ede00-6eda-11ef-afc7-570d4cbe1e63\",\n \"date\": \"09\/09\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 15,\n \"title\": \"Fix Apple News Not Working in macOS Sonoma 14\/14.7\",\n \"source\": {\n \"name\": \"The Mac Observer\",\n \"icon\": \"https:\/\/encrypted-tbn3.gstatic.com\/faviconV2?url=https:\/\/www.macobserver.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\",\n \"authors\": [\n \"Danny Maiorca\"\n ]\n },\n \"link\": \"https:\/\/www.macobserver.com\/macos\/fix-apple-news-not-working-macos-sonoma\/\",\n \"thumbnail\": \"https:\/\/www.macobserver.com\/wp-content\/uploads\/2024\/08\/Apple-News-Not-Working-in-Sonoma-14.6.png\",\n \"date\": \"09\/19\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 16,\n \"title\": \"iPhone SE 4 to come with Apple's & Apple A18 SoC\",\n \"source\": {\n \"name\": \"Android Headlines\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/eEXS3spaZZb8YklkgzyzVCR6F1Kz1HP46ATKcfjCJju06flKjiA8oekf5a_0yMkGz5r45Zv1GQ\",\n \"authors\": [\n \"Kristijan Lucic\"\n ]\n },\n \"link\": \"https:\/\/www.androidheadlines.com\/2024\/10\/iphone-se-4-apple-a18-soc-5g-modem.html\",\n \"thumbnail\": \"https:\/\/www.androidheadlines.com\/wp-content\/uploads\/2024\/10\/Apple-iPhone-14-image-394389438-1420x798.webp\",\n \"date\": \"10\/04\/2024, 10:30 AM, +0000 UTC\"\n },\n {\n \"position\": 17,\n \"title\": \"Phone Comparisons: Apple iPhone 16 Plus vs Samsung Galaxy S24+\",\n \"source\": {\n \"name\": \"Android Headlines\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/eEXS3spaZZb8YklkgzyzVCR6F1Kz1HP46ATKcfjCJju06flKjiA8oekf5a_0yMkGz5r45Zv1GQ\",\n \"authors\": [\n \"Kristijan Lucic\"\n ]\n },\n \"link\": \"https:\/\/www.androidheadlines.com\/phone-comparisons-apple-iphone-16-plus-vs-samsung-galaxy-s24-plus\",\n \"thumbnail\": \"https:\/\/www.androidheadlines.com\/wp-content\/uploads\/2024\/10\/Apple-iPhone-16-Plus-vs-Samsung-Galaxy-S24-Plus-comparison-1-1420x799.webp\",\n \"date\": \"10\/04\/2024, 12:03 AM, +0000 UTC\"\n },\n {\n \"position\": 18,\n \"title\": \"Apple No Longer Investing in OpenAI Despite AI Integration\",\n \"source\": {\n \"name\": \"Android Headlines\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/eEXS3spaZZb8YklkgzyzVCR6F1Kz1HP46ATKcfjCJju06flKjiA8oekf5a_0yMkGz5r45Zv1GQ\",\n \"authors\": [\n \"Arthur Brown\"\n ]\n },\n \"link\": \"https:\/\/www.androidheadlines.com\/2024\/09\/apple-wont-invest-openai.html\",\n \"thumbnail\": \"https:\/\/www.androidheadlines.com\/wp-content\/uploads\/2024\/09\/Apple-and-OpenAI-BW-1420x799.webp\",\n \"date\": \"09\/30\/2024, 06:34 PM, +0000 UTC\"\n },\n {\n \"position\": 19,\n \"title\": \"Apple could FINALLY be breaking into the smart home market\",\n \"source\": {\n \"name\": \"Android Headlines\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/eEXS3spaZZb8YklkgzyzVCR6F1Kz1HP46ATKcfjCJju06flKjiA8oekf5a_0yMkGz5r45Zv1GQ\",\n \"authors\": [\n \"Alap Naik Desai\"\n ]\n },\n \"link\": \"https:\/\/www.androidheadlines.com\/2024\/09\/apple-smart-home-display.html\",\n \"thumbnail\": \"https:\/\/www.androidheadlines.com\/wp-content\/uploads\/2024\/05\/Apple-iPad-launch-event-promo-videos-jpg.webp\",\n \"date\": \"09\/29\/2024, 09:59 PM, +0000 UTC\"\n },\n {\n \"position\": 20,\n \"title\": \"Pebblebee Universal trackers support Google's & Apple's networks\",\n \"source\": {\n \"name\": \"Android Headlines\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/eEXS3spaZZb8YklkgzyzVCR6F1Kz1HP46ATKcfjCJju06flKjiA8oekf5a_0yMkGz5r45Zv1GQ\",\n \"authors\": [\n \"Jean Leon\"\n ]\n },\n \"link\": \"https:\/\/www.androidheadlines.com\/2024\/10\/pebblebee-universal-trackers-support-googles-apples-networks.html\",\n \"thumbnail\": \"https:\/\/www.androidheadlines.com\/wp-content\/uploads\/2024\/10\/Pebblebee-Tag-Universal-trackers-featured-1420x857.webp\",\n \"date\": \"10\/01\/2024, 11:43 PM, +0000 UTC\"\n },\n {\n \"position\": 21,\n \"title\": \"Apple's not done with AR devices!\",\n \"source\": {\n \"name\": \"Android Headlines\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/eEXS3spaZZb8YklkgzyzVCR6F1Kz1HP46ATKcfjCJju06flKjiA8oekf5a_0yMkGz5r45Zv1GQ\",\n \"authors\": [\n \"Alap Naik Desai\"\n ]\n },\n \"link\": \"https:\/\/www.androidheadlines.com\/2024\/09\/apple-lighter-smart-glasses-ai.html\",\n \"date\": \"09\/30\/2024, 02:19 PM, +0000 UTC\"\n },\n {\n \"position\": 22,\n \"title\": \"'Sugar' Renewed for Season 2 at Apple \u2014 Colin Farrell Detective Drama\",\n \"source\": {\n \"name\": \"TVLine\",\n \"icon\": \"https:\/\/encrypted-tbn0.gstatic.com\/faviconV2?url=https:\/\/tvline.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\",\n \"authors\": [\n \"Matt Webb Mitovich\"\n ]\n },\n \"link\": \"https:\/\/tvline.com\/news\/sugar-renewed-season-2-colin-farrell-1235345681\/\",\n \"thumbnail\": \"https:\/\/tvline.com\/wp-content\/uploads\/2024\/10\/sugar-renewed-season-2.jpg?w=600&h=400&crop=1\",\n \"date\": \"10\/02\/2024, 05:00 PM, +0000 UTC\"\n },\n {\n \"position\": 23,\n \"title\": \"iPhone 16 event news: 6 biggest Apple announcements\",\n \"source\": {\n \"name\": \"BGR\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/4FsrisEYLJxNnxAnGn44Oy89qtkBbFouAm47vtzzczHq_8EwiA8EnrB6zBc5XvYkOBLjA35O0bI\",\n \"authors\": [\n \"Jose Adorno\"\n ]\n },\n \"link\": \"https:\/\/bgr.com\/tech\/iphone-16-event-announcements\/\",\n \"thumbnail\": \"https:\/\/bgr.com\/wp-content\/uploads\/2024\/08\/apple-event-iphone-16-its-glowtime-bgr.jpg?quality=82&strip=all&w=1020&h=574&crop=1\",\n \"date\": \"09\/09\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 24,\n \"title\": \"Phone Comparisons: Apple iPhone 15 Pro Max vs Apple iPhone 16 Pro Max\",\n \"source\": {\n \"name\": \"Android Headlines\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/eEXS3spaZZb8YklkgzyzVCR6F1Kz1HP46ATKcfjCJju06flKjiA8oekf5a_0yMkGz5r45Zv1GQ\",\n \"authors\": [\n \"Kristijan Lucic\"\n ]\n },\n \"link\": \"https:\/\/www.androidheadlines.com\/phone-comparisons-apple-iphone-15-pro-max-vs-apple-iphone-16-pro-max\",\n \"thumbnail\": \"https:\/\/www.androidheadlines.com\/wp-content\/uploads\/2024\/09\/Apple-iPhone-15-Pro-Max-vs-Apple-iPhone-16-Pro-Max-comparison-1420x799.webp\",\n \"date\": \"10\/01\/2024, 12:15 AM, +0000 UTC\"\n },\n {\n \"position\": 25,\n \"title\": \"Apple News+ introduces Quartiles, a new original spelling game, and Offline Mode for subscribers\",\n \"source\": {\n \"name\": \"Apple\",\n \"icon\": \"https:\/\/encrypted-tbn2.gstatic.com\/faviconV2?url=https:\/\/www.apple.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\"\n },\n \"link\": \"https:\/\/www.apple.com\/newsroom\/2024\/05\/apple-news-plus-introduces-quartiles-a-new-game-and-offline-mode-for-subscribers\/\",\n \"thumbnail\": \"https:\/\/www.apple.com\/newsroom\/images\/2024\/05\/apple-news-plus-introduces-quartiles-a-new-game-and-offline-mode-for-subscribers\/article\/Apple-News-Plus-updates_big.jpg.large.jpg\",\n \"date\": \"05\/13\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 26,\n \"title\": \"Apple Loop: Apple Confirms iPhone 16 Details, Ted Lasso\u2019s Surprise Return, Final iPhone Design Leaks\",\n \"source\": {\n \"name\": \"Forbes\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/NIjzR9QHtZJllEvJIVkODXFQ7_rbx1BMBXx2rNUbttjuu9YWLIp2_juQaI9jJ2rDtzi6snbZ\",\n \"authors\": [\n \"Ewan Spence\"\n ]\n },\n \"link\": \"https:\/\/www.forbes.com\/sites\/ewanspence\/2024\/09\/01\/apple-news-headlines-iphone-16-pro-launch-date-glow-time-ipad-mini-macbook-m4-ted-lasso\/\",\n \"thumbnail\": \"https:\/\/imageio.forbes.com\/specials-images\/imageserve\/6133b1d73f00df9fdccf31db\/Apple-Holds-Press-Event-To-Introduce-New-iPhone\/960x0.jpg?height=474&width=711&fit=bounds\",\n \"date\": \"09\/01\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 27,\n \"title\": \"As clicks dry up for news sites, could Apple\u2019s news app be a lifeline?\",\n \"source\": {\n \"name\": \"Semafor\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/AbSzSdrdQUkZJn_qrAwfEK1kmdBsfgLZLMoABj-SujOJMwaEez-tWO1eccFXrV-SmdFQsqT6aA\",\n \"authors\": [\n \"Maxwell Tani\"\n ]\n },\n \"link\": \"https:\/\/www.semafor.com\/article\/05\/19\/2024\/as-clicks-dry-up-for-news-sites-could-apples-news-app-be-a-lifeline\",\n \"thumbnail\": \"https:\/\/img.semafor.com\/c2462871f6cdaa0cc014ab883b662fc895228f28-1280x961.png?w=1920&q=75&auto=format\",\n \"date\": \"05\/19\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 28,\n \"title\": \"iPhone 16 event live blog: all the news from Apple\u2019s keynote\",\n \"source\": {\n \"name\": \"The Verge\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/vkRH5gyHtLcKAoRSFHK1ATEgKtHDXoi9iRKKOdVhOng8g7qF2_QCVT1f11q_y_4y95_PY5VzWQ\"\n },\n \"link\": \"https:\/\/www.theverge.com\/2024\/9\/9\/24236176\/apple-iphone-16-liveblog-apple-watch-x-airpods-keynote\",\n \"thumbnail\": \"https:\/\/cdn.vox-cdn.com\/thumbor\/D2Qsyy66kdl2lrFkyytmB9EpbmM=\/0x0:2774x1508\/1200x628\/filters:focal(1387x754:1388x755)\/cdn.vox-cdn.com\/uploads\/chorus_asset\/file\/25612454\/iphone_16_colors.png\",\n \"date\": \"09\/09\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 29,\n \"title\": \"Apple Loop: iPhone 16 Pro Design Leaks, Goodbye Apple ID, Confusion Over iPhone 16 Launch Date\",\n \"source\": {\n \"name\": \"Forbes\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/NIjzR9QHtZJllEvJIVkODXFQ7_rbx1BMBXx2rNUbttjuu9YWLIp2_juQaI9jJ2rDtzi6snbZ\",\n \"authors\": [\n \"Ewan Spence\"\n ]\n },\n \"link\": \"https:\/\/www.forbes.com\/sites\/ewanspence\/2024\/08\/25\/apple-news-headlines-iphone-16-pro-launch-date-iphone-16-specs-ios18-apple-id\/\",\n \"thumbnail\": \"https:\/\/imageio.forbes.com\/specials-images\/imageserve\/66c8e269af3f2a30f86abb0c\/Street-Style---Dusseldorf---October-2023\/0x0.jpg?crop=1557,876,x0,y402,safe&height=400&width=711&fit=bounds\",\n \"date\": \"08\/25\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 30,\n \"title\": \"Apple\u2019s Worldwide Developers Conference to kick off June 10 with Keynote address\",\n \"source\": {\n \"name\": \"Apple\",\n \"icon\": \"https:\/\/encrypted-tbn2.gstatic.com\/faviconV2?url=https:\/\/www.apple.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\"\n },\n \"link\": \"https:\/\/www.apple.com\/newsroom\/2024\/05\/apples-worldwide-developers-conference-to-kick-off-june-10-with-keynote-address\/\",\n \"thumbnail\": \"https:\/\/www.apple.com\/newsroom\/images\/2024\/05\/apples-worldwide-developers-conference-to-kick-off-june-10-with-keynote-address\/article\/Apple-WWDC24-event-details-hero_big.jpg.large.jpg\",\n \"date\": \"05\/28\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 31,\n \"title\": \"Introducing Apple Sports, a new app for sports fans\",\n \"source\": {\n \"name\": \"Apple\",\n \"icon\": \"https:\/\/encrypted-tbn2.gstatic.com\/faviconV2?url=https:\/\/www.apple.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\"\n },\n \"link\": \"https:\/\/www.apple.com\/newsroom\/2024\/02\/introducing-apple-sports-a-new-app-for-sports-fans\/\",\n \"thumbnail\": \"https:\/\/www.apple.com\/newsroom\/images\/2024\/02\/introducing-apple-sports-a-new-app-for-sports-fans\/article\/Apple-Sports-welcome-screen_inline.jpg.large.jpg\",\n \"date\": \"02\/21\/2024, 08:00 AM, +0000 UTC\"\n },\n {\n \"position\": 32,\n \"title\": \"Apple set to unveil iPhone 16 on Monday. Here's what to expect.\",\n \"source\": {\n \"name\": \"CBS News\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/dXy0k7AMf-wXfnj2AtaLk3rZcPGjClkFvKSAQnjoLp9wa_ggxST_WSGqovh984zY8mf3vDmt\",\n \"authors\": [\n \"Megan Cerullo\"\n ]\n },\n \"link\": \"https:\/\/www.cbsnews.com\/news\/apple-iphone-16-what-to-expect\/\",\n \"thumbnail\": \"https:\/\/assets3.cbsnewsstatic.com\/hub\/i\/r\/2024\/09\/06\/54addc5f-0728-44c0-a6ed-82f9c280b1c2\/thumbnail\/1200x630\/7a24cbc0c2d97648057037008029eb18\/gettyimages-2156548093.jpg?v=0736ad3ef1e9ddfe1218648fe91d6c9b\",\n \"date\": \"09\/09\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 33,\n \"title\": \"There may be 'good news' coming for Apple Watch users in the US\",\n \"source\": {\n \"name\": \"The Times of India\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/d9mz-OKghOQPsgxRv1BQzQAI44ifiA_6aAk-gRwo4_32mZXM-TSd5vIY1rL1P2LUH9mFQPnUSRE\"\n },\n \"link\": \"https:\/\/timesofindia.indiatimes.com\/technology\/wearables\/there-may-be-good-news-coming-for-apple-watch-users-in-the-us\/articleshow\/113854337.cms\",\n \"thumbnail\": \"https:\/\/static.toiimg.com\/thumb\/msid-113854293,width-1280,height-720,resizemode-4\/113854293.jpg\",\n \"date\": \"10\/01\/2024, 12:48 PM, +0000 UTC\"\n },\n {\n \"position\": 34,\n \"title\": \"iPhone 17 Pro to include new button which will merge two existing ones\",\n \"source\": {\n \"name\": \"Android Headlines\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/eEXS3spaZZb8YklkgzyzVCR6F1Kz1HP46ATKcfjCJju06flKjiA8oekf5a_0yMkGz5r45Zv1GQ\",\n \"authors\": [\n \"Rishaj Upadhyay\"\n ]\n },\n \"link\": \"https:\/\/www.androidheadlines.com\/2024\/10\/iphone-17-pro-to-include-new-button-which-will-merge-two-existing-ones.html\",\n \"thumbnail\": \"https:\/\/www.androidheadlines.com\/wp-content\/uploads\/2024\/09\/Apple-iPhone-16-Pro-AM-AH-01-1420x799.webp\",\n \"date\": \"10\/01\/2024, 10:09 AM, +0000 UTC\"\n },\n {\n \"position\": 35,\n \"title\": \"Apple Loop: Apple Intelligence Delayed, Cellbrite Locked Out Of iOS, Apple TV\u2019s Emmy Nominations\",\n \"source\": {\n \"name\": \"Forbes\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/NIjzR9QHtZJllEvJIVkODXFQ7_rbx1BMBXx2rNUbttjuu9YWLIp2_juQaI9jJ2rDtzi6snbZ\",\n \"authors\": [\n \"Ewan Spence\"\n ]\n },\n \"link\": \"https:\/\/www.forbes.com\/sites\/ewanspence\/2024\/07\/21\/apple-news-headlines-iphone-16-pro-leaks-release-launch-ai-ipad-pro-cellbrite\/\",\n \"thumbnail\": \"https:\/\/imageio.forbes.com\/specials-images\/imageserve\/6545a83115c6278c1465a3de\/0x0.jpg?format=jpg&height=600&width=1200&fit=bounds\",\n \"date\": \"07\/21\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 36,\n \"title\": \"This is how much iPhone storage Apple Intelligence will require\",\n \"source\": {\n \"name\": \"9to5Mac\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/_yU7TVFBBY59lFTGF_gB-G6AZql5gRMNflxhEDwVjLtWfN6Xh6JPnPNqKAJO75h_BLghOkzYPw\",\n \"authors\": [\n \"Ryan Christoffel\"\n ]\n },\n \"link\": \"https:\/\/9to5mac.com\/2024\/09\/23\/this-is-how-much-iphone-storage-apple-intelligence-will-require\/\",\n \"thumbnail\": \"https:\/\/9to5mac.com\/wp-content\/uploads\/sites\/6\/2024\/09\/iphone16-pro-ai-logo.jpg?quality=82&strip=all&w=1600\",\n \"date\": \"09\/23\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 37,\n \"title\": \"\u2018It\u2019s Glowtime\u2019: all the news from Apple\u2019s iPhone 16 event\",\n \"source\": {\n \"name\": \"The Verge\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/vkRH5gyHtLcKAoRSFHK1ATEgKtHDXoi9iRKKOdVhOng8g7qF2_QCVT1f11q_y_4y95_PY5VzWQ\",\n \"authors\": [\n \"Alex Cranz\"\n ]\n },\n \"link\": \"https:\/\/www.theverge.com\/2024\/9\/9\/24237601\/apple-iphone-16-event-announcements-products\",\n \"thumbnail\": \"https:\/\/i.ytimg.com\/vi\/dIJVwG4Glg8\/maxresdefault.jpg\",\n \"date\": \"09\/14\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 38,\n \"title\": \"Inflation back in focus, Apple's iPhone event: What to know this week\",\n \"source\": {\n \"name\": \"Yahoo Finance\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/L57n4HUzUS8lNXBPYNGQScsyxaqqx42Nym3-tUk8NzkTvMsa95NhzEqC8KMqVPFpAFpCuPFdlA\",\n \"authors\": [\n \"Josh Schafer\"\n ]\n },\n \"link\": \"https:\/\/finance.yahoo.com\/news\/inflation-back-in-focus-apples-iphone-event-what-to-know-this-week-113136249.html\",\n \"thumbnail\": \"https:\/\/s.yimg.com\/ny\/api\/res\/1.2\/1Bz7SGEABqvB5QOtTIiwkQ--\/YXBwaWQ9aGlnaGxhbmRlcjt3PTEyMDA7aD04MDU-\/https:\/\/s.yimg.com\/os\/creatr-uploaded-images\/2024-06\/2278c9e0-276b-11ef-b97e-8b95714806bd\",\n \"date\": \"09\/09\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 39,\n \"title\": \"Apple embraces the AI craze with its newly unleashed iPhone 16 lineup\",\n \"source\": {\n \"name\": \"The Associated Press\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/M087pJgRw3PLf4gl-Y7U-tJn6uaN99AUbFIuX7fmMnhq5QeNylJQMq_UeYPPVaEPk-5jL9I3QA\",\n \"authors\": [\n \"Michael Liedtke\"\n ]\n },\n \"link\": \"https:\/\/apnews.com\/article\/apple-iphone-16-artificial-intelligence-google-samsung-4f30bf40ad89793d80f8ac3a20f9e79c\",\n \"thumbnail\": \"https:\/\/dims.apnews.com\/dims4\/default\/2d71fbe\/2147483647\/strip\/true\/crop\/5472x3648+0+0\/resize\/599x399!\/quality\/90\/?url=https%3A%2F%2Fassets.apnews.com%2Ffc%2F6e%2Fc692a752e1669335caca2261fe74%2F6e07d6ee606d4711b4abe9e152e3a309\",\n \"date\": \"09\/09\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 40,\n \"title\": \"Apple to expand repair options with support for used genuine parts\",\n \"source\": {\n \"name\": \"Apple\",\n \"icon\": \"https:\/\/encrypted-tbn2.gstatic.com\/faviconV2?url=https:\/\/www.apple.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\"\n },\n \"link\": \"https:\/\/www.apple.com\/newsroom\/2024\/04\/apple-to-expand-repair-options-with-support-for-used-genuine-parts\/\",\n \"thumbnail\": \"https:\/\/www.apple.com\/newsroom\/images\/2024\/04\/apple-to-expand-repair-options-with-support-for-used-genuine-parts\/article\/Apple-Self-Service-Repair-iPhone_big.jpg.large.jpg\",\n \"date\": \"04\/11\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 41,\n \"title\": \"Apple Loop: Apple iPhone 16 Pro Details, MacBook Pro\u2019s Glass Design, iPhone SE Leaks\",\n \"source\": {\n \"name\": \"Forbes\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/NIjzR9QHtZJllEvJIVkODXFQ7_rbx1BMBXx2rNUbttjuu9YWLIp2_juQaI9jJ2rDtzi6snbZ\",\n \"authors\": [\n \"Ewan Spence\"\n ]\n },\n \"link\": \"https:\/\/www.forbes.com\/sites\/ewanspence\/2024\/09\/06\/apple-news-headlines-iphone-16-pro-specs-iphone-se-leak-ipad-mini-glowtime\/\",\n \"thumbnail\": \"https:\/\/imageio.forbes.com\/specials-images\/imageserve\/668869a8069becf14d815a6d\/Apple-Holds-Launch-Event-For-New-Products-At-Its-Headquarters\/960x0.jpg?height=489&width=711&fit=bounds\",\n \"date\": \"09\/06\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 42,\n \"title\": \"Apple is cutting jobs across its Books and News apps\",\n \"source\": {\n \"name\": \"The Verge\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/vkRH5gyHtLcKAoRSFHK1ATEgKtHDXoi9iRKKOdVhOng8g7qF2_QCVT1f11q_y_4y95_PY5VzWQ\",\n \"authors\": [\n \"Jess Weatherbed\"\n ]\n },\n \"link\": \"https:\/\/www.theverge.com\/2024\/8\/28\/24230344\/apple-job-layoffs-books-news-apps-digital-services\",\n \"thumbnail\": \"https:\/\/cdn.vox-cdn.com\/thumbor\/2iMntRc0KnWhZnUHElCrbbTAbUA=\/0x0:2040x1360\/1400x1050\/filters:focal(1020x680:1021x681)\/cdn.vox-cdn.com\/uploads\/chorus_asset\/file\/23598986\/VRG_Illo_5258_K_Radtke_WWDC.jpg\",\n \"date\": \"08\/28\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 43,\n \"title\": \"Apple unveils the new 13- and 15-inch MacBook Air with the powerful M3 chip\",\n \"source\": {\n \"name\": \"Apple\",\n \"icon\": \"https:\/\/encrypted-tbn2.gstatic.com\/faviconV2?url=https:\/\/www.apple.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\"\n },\n \"link\": \"https:\/\/www.apple.com\/newsroom\/2024\/03\/apple-unveils-the-new-13-and-15-inch-macbook-air-with-the-powerful-m3-chip\/\",\n \"thumbnail\": \"https:\/\/www.apple.com\/newsroom\/images\/2024\/03\/apple-unveils-the-new-13-and-15-inch-macbook-air-with-the-powerful-m3-chip\/article\/Apple-MacBook-Air-2-up-hero-240304_big.jpg.large.jpg\",\n \"date\": \"03\/04\/2024, 08:00 AM, +0000 UTC\"\n },\n {\n \"position\": 44,\n \"title\": \"Good news for iPhone users, more Apple stores coming to THESE Indian cities soon\",\n \"source\": {\n \"name\": \"DNA India\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/G2KZIntNftmv-PAdzkbpVtP9klOT7CEsOzEu2Ke7HVC0FZXHw2U4SVJZl-xac-wfAeFe05LJZQ\",\n \"authors\": [\n \"Shivam Verma\"\n ]\n },\n \"link\": \"https:\/\/www.dnaindia.com\/viral\/report-good-news-for-iphone-users-more-apple-stores-coming-to-these-indian-cities-soon-3111366\",\n \"thumbnail\": \"https:\/\/cdn.dnaindia.com\/sites\/default\/files\/styles\/full\/public\/2024\/10\/04\/2655811-image-66.jpg\",\n \"date\": \"10\/04\/2024, 08:28 AM, +0000 UTC\"\n },\n {\n \"position\": 45,\n \"title\": \"Apple lays off 100 workers from its Apple News and Apple Books apps\",\n \"source\": {\n \"name\": \"New York Post \",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/FBmNEg55AyjS01UGglfHSug5fD4qJyNNZ6QXqwDhQczAmw6zPz5fUoWm9AfOtz7Ty70Gg41A\"\n },\n \"link\": \"https:\/\/nypost.com\/2024\/08\/28\/business\/apple-lays-off-100-workers-from-its-apple-news-and-apple-books-apps\/\",\n \"thumbnail\": \"https:\/\/nypost.com\/wp-content\/uploads\/sites\/2\/2024\/08\/apple-ceo-tim-cook-delivers-17743748.jpg?w=1024\",\n \"date\": \"08\/28\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 46,\n \"title\": \"Apple iPhone 16 event: What to expect from the AI-packed 'Glowtime' show\",\n \"source\": {\n \"name\": \"Yahoo Finance\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/L57n4HUzUS8lNXBPYNGQScsyxaqqx42Nym3-tUk8NzkTvMsa95NhzEqC8KMqVPFpAFpCuPFdlA\",\n \"authors\": [\n \"Daniel Howley\"\n ]\n },\n \"link\": \"https:\/\/finance.yahoo.com\/news\/apple-iphone-16-event-what-to-expect-from-the-ai-packed-glowtime-show-181750139.html\",\n \"thumbnail\": \"https:\/\/s.yimg.com\/ny\/api\/res\/1.2\/FUpP8OzTu4hsXjNvTWFFTw--\/YXBwaWQ9aGlnaGxhbmRlcjt3PTY0MDtoPTQyNw--\/https:\/\/s.yimg.com\/os\/creatr-uploaded-images\/2024-07\/a5f8edd0-4ee0-11ef-b3d7-42acff46b782\",\n \"date\": \"09\/09\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 47,\n \"title\": \"The Athletic joins Apple News+\",\n \"source\": {\n \"name\": \"Apple\",\n \"icon\": \"https:\/\/encrypted-tbn2.gstatic.com\/faviconV2?url=https:\/\/www.apple.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\"\n },\n \"link\": \"https:\/\/www.apple.com\/newsroom\/2023\/12\/the-athletic-joins-apple-news-plus\/\",\n \"thumbnail\": \"https:\/\/www.apple.com\/newsroom\/images\/2023\/12\/the-athletic-joins-apple-news-plus\/article\/Apple-News-Plus-The-Athletic_inline.jpg.large.jpg\",\n \"date\": \"12\/19\/2023, 08:00 AM, +0000 UTC\"\n },\n {\n \"position\": 48,\n \"title\": \"Apple News Widget Disappeared After Updating to iOS 17.4.1\",\n \"source\": {\n \"name\": \"The Mac Observer\",\n \"icon\": \"https:\/\/encrypted-tbn3.gstatic.com\/faviconV2?url=https:\/\/www.macobserver.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\",\n \"authors\": [\n \"Danny Maiorca\"\n ]\n },\n \"link\": \"https:\/\/www.macobserver.com\/iphone\/apple-news-widget-disappeared-after-updating-to-ios-17-4-1\/\",\n \"thumbnail\": \"https:\/\/www.macobserver.com\/wp-content\/uploads\/2024\/05\/Apple-News-Widget-Disappeared-iOS-17.4.png\",\n \"date\": \"05\/07\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 49,\n \"title\": \"Apple Arcade launches three new games in September, including NFL Retro Bowl \u201925\",\n \"source\": {\n \"name\": \"Apple\",\n \"icon\": \"https:\/\/encrypted-tbn2.gstatic.com\/faviconV2?url=https:\/\/www.apple.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\"\n },\n \"link\": \"https:\/\/www.apple.com\/newsroom\/2024\/08\/apple-arcade-launches-three-new-games-in-september-including-nfl-retro-bowl-25\/\",\n \"thumbnail\": \"https:\/\/www.apple.com\/newsroom\/images\/2024\/08\/apple-arcade-launches-three-new-games-in-september-including-nfl-retro-bowl-25\/article\/Apple-Arcade-hero_big.jpg.large.jpg\",\n \"date\": \"08\/06\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 50,\n \"title\": \"Apple 'Glowtime' event sees iPhone 16, iPhone 16 Pro, Apple Watch unveilings: Recap\",\n \"source\": {\n \"name\": \"USA TODAY\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/-azIrtjYWp_uW0mZr2EgCuDyyZ9WpFOIWNx3qM1wwCzV37NgmqATpNZGn9R0y8XklFku6Hhwz6w\",\n \"authors\": [\n \"Jonathan Limehouse\",\n \"James C. Powel\",\n \"Felecia Wellington Radel\"\n ]\n },\n \"link\": \"https:\/\/www.usatoday.com\/story\/tech\/news\/2024\/09\/09\/apple-event-2024-live-updates-iphone-watch-airpod\/75104890007\/\",\n \"thumbnail\": \"https:\/\/www.usatoday.com\/gcdn\/authoring\/authoring-images\/2024\/09\/04\/USAT\/75072775007-apple-glowtime-event.png?crop=1004,564,x14,y0&width=660&height=371&format=pjpg&auto=webp\",\n \"date\": \"09\/09\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 51,\n \"title\": \"Apple Loop: iPhone 16 Pro Details, iOS 18\u2019s AI Plans, iPhone 14 Pro Special Offer\",\n \"source\": {\n \"name\": \"Forbes\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/NIjzR9QHtZJllEvJIVkODXFQ7_rbx1BMBXx2rNUbttjuu9YWLIp2_juQaI9jJ2rDtzi6snbZ\",\n \"authors\": [\n \"Ewan Spence\"\n ]\n },\n \"link\": \"https:\/\/www.forbes.com\/sites\/ewanspence\/2024\/06\/02\/apple-news-headlines-iphone-16-pro-ios-18-ai-ipad-pro-logo-macbook-pro-oled\/\",\n \"thumbnail\": \"https:\/\/imageio.forbes.com\/specials-images\/imageserve\/6622e32e24ecc74de9e50e06\/Apple-Unveils-iPhone-15-And-Other-New-Products\/0x0.jpg?crop=2880,1621,x420,y192,safe&height=400&width=711&fit=bounds\",\n \"date\": \"06\/02\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 52,\n \"title\": \"Apple Lays Off Staff Across Books, News App Divisions\",\n \"source\": {\n \"name\": \"PCMag\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/ayu6HNJcgzsC2c6JZnG6pEUI7oJ_DbiHoRxecNd8OUpY7r9r8hY4ZIDk2y765p5W50H_J8jkooM\",\n \"authors\": [\n \"Kate Irwin\"\n ]\n },\n \"link\": \"https:\/\/www.pcmag.com\/news\/apple-lays-off-staff-across-books-news-app-services-divisions\",\n \"thumbnail\": \"https:\/\/i.pcmag.com\/imagery\/articles\/03eZIlXKJeNJVlrbo07QM51-1.fit_lim.v1724850338.png\",\n \"date\": \"08\/28\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 53,\n \"title\": \"Apple Loop: iPhone 16 Pro Details Leak, Hidden iPad Hardware, Android\u2019s Latest Win Over Apple\",\n \"source\": {\n \"name\": \"Forbes\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/NIjzR9QHtZJllEvJIVkODXFQ7_rbx1BMBXx2rNUbttjuu9YWLIp2_juQaI9jJ2rDtzi6snbZ\",\n \"authors\": [\n \"Ewan Spence\"\n ]\n },\n \"link\": \"https:\/\/www.forbes.com\/sites\/ewanspence\/2024\/06\/08\/apple-news-headlines-iphone-16-pro-leak-ipad-pro-wwdc-ai-security\/\",\n \"thumbnail\": \"https:\/\/imageio.forbes.com\/specials-images\/imageserve\/66636d86089e3fb303da0303\/New-Apple-iPads-Go-On-Sale-At-Fifth-Avenue-Store\/960x0.jpg?height=474&width=711&fit=bounds\",\n \"date\": \"06\/08\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 54,\n \"title\": \"California IDs coming soon in Apple Wallet and Google Wallet\",\n \"source\": {\n \"name\": \"Office of Governor Gavin Newsom\",\n \"icon\": \"https:\/\/encrypted-tbn2.gstatic.com\/faviconV2?url=https:\/\/www.gov.ca.gov&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\",\n \"authors\": [\n \"Gavin Newsom\"\n ]\n },\n \"link\": \"https:\/\/www.gov.ca.gov\/2024\/08\/15\/california-ids-coming-soon-in-apple-wallet-and-google-wallet\/\",\n \"thumbnail\": \"https:\/\/www.gov.ca.gov\/wp-content\/uploads\/2024\/08\/California-IDs-SEO-Graphic-1080x675.png\",\n \"date\": \"08\/15\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 55,\n \"title\": \"iPhone 16 Pro: release date, new cameras, A18 Pro, Camera Control and more \u2013 here's what you need to know\",\n \"source\": {\n \"name\": \"TechRadar\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/h3jba9VMZkFHG1QVakElUh94ugAfWEJfnBwg-v1YYuGEsB7Xo0Na9-1HSp2RTIvArgKT-D_A5g\",\n \"authors\": [\n \"Roland Moore-Colyer\"\n ]\n },\n \"link\": \"https:\/\/www.techradar.com\/phones\/iphone\/iphone-16-pro\",\n \"thumbnail\": \"https:\/\/cdn.mos.cms.futurecdn.net\/DDqGSRPV45EJvNtvRwHxPd-320-80.png\",\n \"date\": \"09\/18\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 56,\n \"title\": \"Apple's new AirPods Pro double as a hearing aid. Experts call it a game changer.\",\n \"source\": {\n \"name\": \"CBS News\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/dXy0k7AMf-wXfnj2AtaLk3rZcPGjClkFvKSAQnjoLp9wa_ggxST_WSGqovh984zY8mf3vDmt\",\n \"authors\": [\n \"Megan Cerullo\"\n ]\n },\n \"link\": \"https:\/\/www.cbsnews.com\/news\/apples-new-airpods-pro-double-hearing-aid\/\",\n \"thumbnail\": \"https:\/\/assets3.cbsnewsstatic.com\/hub\/i\/r\/2024\/09\/10\/b796220b-1f31-4d4a-9b1d-a383f333a4d5\/thumbnail\/1200x630\/e046aad944f476d4f71065b59e8dafb7\/gettyimages-2171047193.jpg?v=fa529222a2be3543711c1a879b51e860\",\n \"date\": \"09\/13\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 57,\n \"title\": \"Apple\u2019s iPhone 16 launch is a big test for consumer AI\",\n \"source\": {\n \"name\": \"Yahoo Finance\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/L57n4HUzUS8lNXBPYNGQScsyxaqqx42Nym3-tUk8NzkTvMsa95NhzEqC8KMqVPFpAFpCuPFdlA\",\n \"authors\": [\n \"Daniel Howley\"\n ]\n },\n \"link\": \"https:\/\/finance.yahoo.com\/news\/apples-iphone-16-launch-is-a-big-test-for-consumer-ai-181548603.html\",\n \"thumbnail\": \"https:\/\/s.yimg.com\/ny\/api\/res\/1.2\/ZweYEdjcJM2rCmkSGG4npA--\/YXBwaWQ9aGlnaGxhbmRlcjt3PTY0MDtoPTQyNw--\/https:\/\/s.yimg.com\/os\/creatr-uploaded-images\/2024-08\/86b0bc10-6ae1-11ef-9fd4-62b5910b12bb\",\n \"date\": \"09\/04\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 58,\n \"title\": \"Apple Loop: New iPhone 16 Features Confirmed, MacBook Pro Delay, iPhone AAA Games Have Bombed\",\n \"source\": {\n \"name\": \"Forbes\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/NIjzR9QHtZJllEvJIVkODXFQ7_rbx1BMBXx2rNUbttjuu9YWLIp2_juQaI9jJ2rDtzi6snbZ\",\n \"authors\": [\n \"Ewan Spence\"\n ]\n },\n \"link\": \"https:\/\/www.forbes.com\/sites\/ewanspence\/2024\/06\/28\/apple-news-headlines-iphone-16-leak-macbook-pro-m4-ipad-pro-sales\/\",\n \"thumbnail\": \"https:\/\/imageio.forbes.com\/specials-images\/imageserve\/664940ea417cea3021099a6a\/Apple-Unveils-iPhone-15-And-Other-New-Products\/960x0.jpg?height=449&width=711&fit=bounds\",\n \"date\": \"06\/28\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 59,\n \"title\": \"Exclusive: Taboola to sell ads for Apple\",\n \"source\": {\n \"name\": \"Axios\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/l85lUZ33FMIg2XGtWUFSQsRjWkxTQE_JPUVzDezzc7JDHPJO0PZgRCyNWe67UZZCQaNx6K97\",\n \"authors\": [\n \"Sara Fischer\"\n ]\n },\n \"link\": \"https:\/\/www.axios.com\/2024\/07\/16\/taboola-apple-news-deal\",\n \"thumbnail\": \"https:\/\/images.axios.com\/7PMjzI4dv5YV1_XhTqQOAU1jL3k=\/0x0:1952x1098\/1920x1080\/2024\/07\/16\/1721135329623.png\",\n \"date\": \"07\/16\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 60,\n \"title\": \"Apple News+ replaced my newsletter habit\",\n \"source\": {\n \"name\": \"Reviewed\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/wz3EnDKTmLVwIuKKV2kZTly3UaroVuW34yC_gQ_w4Bt--ifr3Z-HKSu0KgRXPAi8Y64V9ObsVQ\",\n \"authors\": [\n \"Courtney Campbell\"\n ]\n },\n \"link\": \"https:\/\/reviewed.usatoday.com\/tech\/features\/apple-news-review-news-subscription-worth\",\n \"thumbnail\": \"https:\/\/reviewed-com-res.cloudinary.com\/image\/fetch\/s--y3RbFqUl--\/b_white,c_limit,cs_srgb,f_auto,fl_progressive.strip_profile,g_center,q_auto,w_972\/https:\/\/reviewed-production.s3.amazonaws.com\/1616530543524\/apple-news-hero.jpg\",\n \"date\": \"05\/27\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 61,\n \"title\": \"Apple Maps Just Announced a Big Change. It\u2019s Very Bad News for Google\",\n \"source\": {\n \"name\": \"Inc.\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/6LaSJ44XANPmwl4MsjUF0lNmdjX0X_KWzn4GqBuQqjrOoaIURNh4U4ukcGIV2EOX3xYtAX0s\",\n \"authors\": [\n \"Jason Aten\"\n ]\n },\n \"link\": \"https:\/\/www.inc.com\/jason-aten\/apple-maps-just-announced-a-big-change-its-very-bad-news-for-google.html\",\n \"thumbnail\": \"https:\/\/img-cdn.inc.com\/image\/upload\/f_webp,c_fit,w_1920,q_auto\/images\/panoramic\/getty_533705614_wih2oe.jpg\",\n \"date\": \"07\/25\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 62,\n \"title\": \"Apple Loop: iPhone 16 Pro Release Date, Apple Intelligence Delay, iPhone Air Leaks\",\n \"source\": {\n \"name\": \"Forbes\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/NIjzR9QHtZJllEvJIVkODXFQ7_rbx1BMBXx2rNUbttjuu9YWLIp2_juQaI9jJ2rDtzi6snbZ\",\n \"authors\": [\n \"Ewan Spence\"\n ]\n },\n \"link\": \"https:\/\/www.forbes.com\/sites\/ewanspence\/2024\/08\/09\/apple-news-headlines-iphone-16-pro-release-date-iphone-air-macbook-pro-m4\/\",\n \"thumbnail\": \"https:\/\/imageio.forbes.com\/specials-images\/imageserve\/66b66f2ee8af9409d28bb6db\/Apple-iPhone-15-And-Apple-Watch-Series-9-Launches-In-Australia\/960x0.jpg?height=474&width=711&fit=bounds\",\n \"date\": \"08\/10\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 63,\n \"title\": \"Apple's artificial intelligence features to be delayed, Bloomberg News reports\",\n \"source\": {\n \"name\": \"Reuters\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/OzNZmYwP-Zl3sTWa8dzzyws9hou0ZihOGJ_-qanon-1iB5KwyqcHOwPxYZj54cGMZwD5qXui\",\n \"authors\": [\n \"Gursimran Kaur\",\n \"Chris Reese\"\n ]\n },\n \"link\": \"https:\/\/www.reuters.com\/technology\/apples-artificial-intelligence-features-be-delayed-bloomberg-news-reports-2024-07-28\/\",\n \"thumbnail\": \"https:\/\/cloudfront-us-east-2.images.arcpublishing.com\/reuters\/QH6Z7UBVIFPPDD2PADPC4E4U4E.jpg\",\n \"date\": \"07\/28\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 64,\n \"title\": \"Apple cuts about 100 digital services jobs, Bloomberg News reports\",\n \"source\": {\n \"name\": \"Reuters\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/OzNZmYwP-Zl3sTWa8dzzyws9hou0ZihOGJ_-qanon-1iB5KwyqcHOwPxYZj54cGMZwD5qXui\",\n \"authors\": [\n \"Kanjyik Ghosh\",\n \"Savio D'souza\",\n \"Nivedita Bhattacharjee\"\n ]\n },\n \"link\": \"https:\/\/www.reuters.com\/technology\/apple-cuts-about-100-jobs-its-services-division-bloomberg-news-reports-2024-08-28\/\",\n \"thumbnail\": \"https:\/\/cloudfront-us-east-2.images.arcpublishing.com\/reuters\/LHKVZ4VZPNM4JB242TX3YWNCSU.jpg\",\n \"date\": \"08\/27\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 65,\n \"title\": \"Here\u2019s everything new in Apple Notes for iOS 18\",\n \"source\": {\n \"name\": \"9to5Mac\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/_yU7TVFBBY59lFTGF_gB-G6AZql5gRMNflxhEDwVjLtWfN6Xh6JPnPNqKAJO75h_BLghOkzYPw\",\n \"authors\": [\n \"Ryan Christoffel\"\n ]\n },\n \"link\": \"https:\/\/9to5mac.com\/whats-new-in-apple-notes-for-ios-18\/\",\n \"thumbnail\": \"https:\/\/9to5mac.com\/wp-content\/uploads\/sites\/6\/2024\/06\/notes-app-icon.jpg?quality=82&strip=all&w=1024\",\n \"date\": \"09\/25\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 66,\n \"title\": \"Live updates: Apple event; iPhone 16 debuts, designed for AI\",\n \"source\": {\n \"name\": \"CNN\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/8zdvTbISHUn-4iHkauW-_yQSGPD9BMrx9EWfqTIhiVm2YMYqhHC1HJWNDQoSOkMk0MRPYKxjIg\",\n \"authors\": [\n \"Samantha Delouya\",\n \"Elise Hammond\",\n \"Samantha Murphy Kelly\"\n ]\n },\n \"link\": \"https:\/\/www.cnn.com\/business\/live-news\/apple-event-iphone-16-09-09-24\/index.html\",\n \"thumbnail\": \"https:\/\/media.cnn.com\/api\/v1\/images\/stellar\/prod\/iphone16editv2-00-00-09-03-still001.jpg?c=16x9&q=w_1280,c_fill\",\n \"date\": \"09\/09\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 67,\n \"title\": \"Apple Lays Off Around 100 Services Staff Across Apple Books and News\",\n \"source\": {\n \"name\": \"MacRumors\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/3SBMAEqsqmKgiDfi4ZLKs_-e-bKbdb5T-EPgbxAFN1kr6_qPClz_Nd2RP3ja9ZqITXLDV58QzQ\",\n \"authors\": [\n \"Tim Hardwick\"\n ]\n },\n \"link\": \"https:\/\/www.macrumors.com\/2024\/08\/28\/apple-lays-off-services-staff-apple-books\/\",\n \"thumbnail\": \"https:\/\/images.macrumors.com\/t\/SyF1yecoV1ebd0nfLMHycKhAGiw=\/400x0\/article-new\/2024\/08\/apple-books.jpg?lossy\",\n \"date\": \"08\/28\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 68,\n \"title\": \"Apple iPad event: all the news from Apple\u2019s \u201cLet Loose\u201d reveal\",\n \"source\": {\n \"name\": \"The Verge\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/vkRH5gyHtLcKAoRSFHK1ATEgKtHDXoi9iRKKOdVhOng8g7qF2_QCVT1f11q_y_4y95_PY5VzWQ\",\n \"authors\": [\n \"Wes Davis\"\n ]\n },\n \"link\": \"https:\/\/www.theverge.com\/2024\/5\/7\/24150047\/apple-ipad-let-loose-event-news-announcements\",\n \"thumbnail\": \"https:\/\/i.ytimg.com\/vi\/bMdhx5ijGN8\/maxresdefault.jpg\",\n \"date\": \"05\/14\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 69,\n \"title\": \"Apple Loop: iPhone 16 Pro Expectations, iPhone Air Details, Apple Watch SE Leaks\",\n \"source\": {\n \"name\": \"Forbes\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/NIjzR9QHtZJllEvJIVkODXFQ7_rbx1BMBXx2rNUbttjuu9YWLIp2_juQaI9jJ2rDtzi6snbZ\",\n \"authors\": [\n \"Ewan Spence\"\n ]\n },\n \"link\": \"https:\/\/www.forbes.com\/sites\/ewanspence\/2024\/08\/16\/apple-news-headlines-iphone-16-pro-iphone-air-epic-app-store\/\",\n \"thumbnail\": \"https:\/\/imageio.forbes.com\/specials-images\/imageserve\/6622e32e24ecc74de9e50e06\/Apple-Unveils-iPhone-15-And-Other-New-Products\/960x0.jpg?height=473&width=711&fit=bounds\",\n \"date\": \"08\/16\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 70,\n \"title\": \"Five new games, including Ubisoft\u2019s Rabbids: Legends of the Multiverse, arrive on Apple Arcade\",\n \"source\": {\n \"name\": \"Apple\",\n \"icon\": \"https:\/\/encrypted-tbn2.gstatic.com\/faviconV2?url=https:\/\/www.apple.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\"\n },\n \"link\": \"https:\/\/www.apple.com\/newsroom\/2024\/05\/new-games-including-rabbids-legends-of-the-multiverse-arrive-on-apple-arcade\/\",\n \"thumbnail\": \"https:\/\/www.apple.com\/newsroom\/images\/2024\/05\/new-games-including-rabbids-legends-of-the-multiverse-arrive-on-apple-arcade\/article\/Apple-Arcade-hero_big.jpg.large.jpg\",\n \"date\": \"05\/06\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 71,\n \"title\": \"Apple Vision Pro unlocks new opportunities for health app developers\",\n \"source\": {\n \"name\": \"Apple\",\n \"icon\": \"https:\/\/encrypted-tbn2.gstatic.com\/faviconV2?url=https:\/\/www.apple.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\"\n },\n \"link\": \"https:\/\/www.apple.com\/newsroom\/2024\/03\/apple-vision-pro-unlocks-new-opportunities-for-health-app-developers\/\",\n \"thumbnail\": \"https:\/\/www.apple.com\/newsroom\/videos\/apple-vision-pro-health-apps-visage-ease-vp\/posters\/Apple-Vision-Pro-health-apps-Visage-Ease-VP.jpg.large_2x.jpg\",\n \"date\": \"03\/11\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 72,\n \"title\": \"Apple Arcade launches five fun titles in April\",\n \"source\": {\n \"name\": \"Apple\",\n \"icon\": \"https:\/\/encrypted-tbn2.gstatic.com\/faviconV2?url=https:\/\/www.apple.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\"\n },\n \"link\": \"https:\/\/www.apple.com\/newsroom\/2024\/03\/apple-arcade-launches-five-fun-titles-in-april\/\",\n \"thumbnail\": \"https:\/\/www.apple.com\/newsroom\/images\/2024\/03\/apple-arcade-launches-five-fun-titles-in-april\/article\/Apple-Arcade-hero_big.jpg.large.jpg\",\n \"date\": \"03\/12\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 73,\n \"title\": \"Apple leaps into AI with an array of upcoming iPhone features and a ChatGPT deal to smarten up\",\n \"source\": {\n \"name\": \"The Associated Press\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/M087pJgRw3PLf4gl-Y7U-tJn6uaN99AUbFIuX7fmMnhq5QeNylJQMq_UeYPPVaEPk-5jL9I3QA\",\n \"authors\": [\n \"Michael Liedtke\"\n ]\n },\n \"link\": \"https:\/\/apnews.com\/article\/apple-artificial-intelligence-siri-iphone-software-conference-4217d67977f95ead880835a71ecce098\",\n \"thumbnail\": \"https:\/\/dims.apnews.com\/dims4\/default\/62f02a8\/2147483647\/strip\/true\/crop\/5074x3383+0+0\/resize\/599x399!\/quality\/90\/?url=https%3A%2F%2Fassets.apnews.com%2Fd3%2Fa2%2F94c981c15091dd9b14acc4c09dbd%2Fa8e81e844947478d9bee864d6b8d9ff5\",\n \"date\": \"06\/10\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 74,\n \"title\": \"New Apple iPhone: What to know ahead of the company's September 9 event\",\n \"source\": {\n \"name\": \"FOX 10 News Phoenix\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/JmHj21m-BM-E2qu1_FWvXaYLuPmdD-I8DcEPNAKPcLNpRHE0bJrzqpdKwLmDjLfQETQM6pVM\",\n \"authors\": [\n \"Kenneth Wong\"\n ]\n },\n \"link\": \"https:\/\/www.fox10phoenix.com\/news\/new-apple-iphone-what-know-ahead-companys-september-9-event\",\n \"thumbnail\": \"https:\/\/images.foxtv.com\/static.fox10phoenix.com\/www.fox10phoenix.com\/content\/uploads\/2024\/09\/764\/432\/GETTY-Apple-Event-090324-scaled.jpg?ve=1&tl=1\",\n \"date\": \"09\/03\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 75,\n \"title\": \"iPhone 16 is here: Apple event live blog and news hub\",\n \"source\": {\n \"name\": \"9to5Mac\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/_yU7TVFBBY59lFTGF_gB-G6AZql5gRMNflxhEDwVjLtWfN6Xh6JPnPNqKAJO75h_BLghOkzYPw\",\n \"authors\": [\n \"Chance Miller\"\n ]\n },\n \"link\": \"https:\/\/9to5mac.com\/2024\/09\/09\/iphone-16-event-live-news-blog\/\",\n \"thumbnail\": \"https:\/\/9to5mac.com\/wp-content\/uploads\/sites\/6\/2024\/09\/9to5Glowtime.jpg?quality=82&strip=all&w=1600\",\n \"date\": \"09\/09\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 76,\n \"title\": \"Apple renews \u201cFor All Mankind\u201d and announces new spinoff series \u201cStar City\u201d\",\n \"source\": {\n \"name\": \"Apple\",\n \"icon\": \"https:\/\/encrypted-tbn2.gstatic.com\/faviconV2?url=https:\/\/www.apple.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\"\n },\n \"link\": \"https:\/\/www.apple.com\/tv-pr\/news\/2024\/04\/apple-renews-globally-acclaimed-hit-space-drama-for-all-mankind-for-season-five-and-announces-new-spinoff-series-star-city\/\",\n \"thumbnail\": \"https:\/\/www.apple.com\/tv-pr\/articles\/2024\/04\/apple-renews-globally-acclaimed-hit-space-drama-for-all-mankind-for-season-five-and-announces-new-spinoff-series-star-city\/images\/big-image\/big-image-01\/041724_For_All_Mankind_Big_Image_01_big_image_post.jpg.large.jpg\",\n \"date\": \"04\/17\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 77,\n \"title\": \"Apple Loop: Apple\u2019s AI Partners, Cheaper Apple Vision Plans, DoJ Launches Anti-Trust Suit\",\n \"source\": {\n \"name\": \"Forbes\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/NIjzR9QHtZJllEvJIVkODXFQ7_rbx1BMBXx2rNUbttjuu9YWLIp2_juQaI9jJ2rDtzi6snbZ\",\n \"authors\": [\n \"Ewan Spence\"\n ]\n },\n \"link\": \"https:\/\/www.forbes.com\/sites\/ewanspence\/2024\/03\/22\/apple-news-headlines-iphone-16-leak-camera-bezels-ipad-pro-apple-vision-pro\/\",\n \"thumbnail\": \"https:\/\/imageio.forbes.com\/specials-images\/imageserve\/650e0fd40135e3d2db5a330f\/Apple-s-New-iPhone-15-Goes-On-Sale\/0x0.jpg?crop=2905,1635,x0,y150,safe&height=400&width=711&fit=bounds\",\n \"date\": \"03\/22\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 78,\n \"title\": \"Apple\u2019s hit, global phenomenon workplace thriller \u201cSeverance\u201d to return for season two on Friday, January 17, 2025\",\n \"source\": {\n \"name\": \"Apple\",\n \"icon\": \"https:\/\/encrypted-tbn2.gstatic.com\/faviconV2?url=https:\/\/www.apple.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\"\n },\n \"link\": \"https:\/\/www.apple.com\/tv-pr\/news\/2024\/07\/apples-hit-global-phenomenon-workplace-thriller-severance-to-return-for-season-two-on-friday-january-17-2025\/\",\n \"thumbnail\": \"https:\/\/www.apple.com\/tv-pr\/articles\/2024\/07\/apples-hit-global-phenomenon-workplace-thriller-severance-to-return-for-season-two-on-friday-january-17-2025\/images\/big-image\/big-image-01\/07102024_Severence_Season_Two_Premiere_Date_big_image_post.jpg.large.jpg\",\n \"date\": \"07\/10\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 79,\n \"title\": \"Apple must pay Ireland more than $14 billion in back taxes, court rules\",\n \"source\": {\n \"name\": \"CBS News\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/dXy0k7AMf-wXfnj2AtaLk3rZcPGjClkFvKSAQnjoLp9wa_ggxST_WSGqovh984zY8mf3vDmt\"\n },\n \"link\": \"https:\/\/www.cbsnews.com\/news\/apple-to-pay-ireland-14-billion-tim-cook-back-taxes\/\",\n \"thumbnail\": \"https:\/\/assets3.cbsnewsstatic.com\/hub\/i\/r\/2024\/07\/27\/b6d2ce56-c8c4-47d1-8f68-118186c02f1c\/thumbnail\/1200x630\/b21fdf40da120196a841d7e360ba786e\/gettyimages-2152534755.jpg?v=159d4576ec63c034c87559bf5085176a\",\n \"date\": \"09\/10\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 80,\n \"title\": \"Apple Event 2024: All the iPhone 16, Apple Watch and AirPods news expected today\",\n \"source\": {\n \"name\": \"Engadget\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/w1hw-XN8YegN8sGKZCmPe7kI0pLiUti33nZ-iKgN0SIOp0KGL_lwI6vgitklgkgrI1yBw28R8A\",\n \"authors\": [\n \"Lawrence Bonk\"\n ]\n },\n \"link\": \"https:\/\/www.engadget.com\/mobile\/smartphones\/apple-event-2024-all-the-iphone-16-apple-watch-and-airpods-news-expected-today-192347434.html\",\n \"thumbnail\": \"https:\/\/s.yimg.com\/os\/creatr-uploaded-images\/2024-08\/34a59ca0-5e53-11ef-ba7b-af5588b97577\",\n \"date\": \"09\/09\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 81,\n \"title\": \"Apple to open 4 more stores, sell \u2019Made in India\u2019 iPhone 16 series\",\n \"source\": {\n \"name\": \"Mangalore Today\",\n \"icon\": \"https:\/\/encrypted-tbn2.gstatic.com\/faviconV2?url=https:\/\/www.mangaloretoday.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\"\n },\n \"link\": \"https:\/\/www.mangaloretoday.com\/headlines\/Apple-to-open-4-more-stores-sell-rsquo-Made-in-India-rsquo-iPhone-16-series.html\",\n \"thumbnail\": \"https:\/\/www.mangaloretoday.com\/contentfiles\/2024\/oct\/I%20phone%204oct24.JPG\",\n \"date\": \"10\/04\/2024, 05:28 AM, +0000 UTC\"\n },\n {\n \"position\": 82,\n \"title\": \"Bad news: two of the best Apple Intelligence features might be delayed until iOS 18.2\",\n \"source\": {\n \"name\": \"TechRadar\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/h3jba9VMZkFHG1QVakElUh94ugAfWEJfnBwg-v1YYuGEsB7Xo0Na9-1HSp2RTIvArgKT-D_A5g\",\n \"authors\": [\n \"Axel Metz\"\n ]\n },\n \"link\": \"https:\/\/www.techradar.com\/phones\/ios\/bad-news-two-of-the-best-apple-intelligence-features-might-be-delayed-until-ios-182\",\n \"thumbnail\": \"https:\/\/cdn.mos.cms.futurecdn.net\/it2Cd3ZKp4aSzuu8ERSXdA-320-80.jpg\",\n \"date\": \"09\/09\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 83,\n \"title\": \"Apple iPhone 16 is the least popular iPhone series in years\",\n \"source\": {\n \"name\": \"Android Headlines\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/eEXS3spaZZb8YklkgzyzVCR6F1Kz1HP46ATKcfjCJju06flKjiA8oekf5a_0yMkGz5r45Zv1GQ\",\n \"authors\": [\n \"Priya Ahluwalia\"\n ]\n },\n \"link\": \"https:\/\/www.androidheadlines.com\/2024\/09\/iphone-16-least-popular-iphone-series-in-years.html\",\n \"thumbnail\": \"https:\/\/www.androidheadlines.com\/wp-content\/uploads\/2024\/09\/Apple-iPhone-16-Pro-AH-1420x799.webp\",\n \"date\": \"09\/26\/2024, 12:35 PM, +0000 UTC\"\n },\n {\n \"position\": 84,\n \"title\": \"Apple 'Glowtime' event latest news \u2014 iPhone 16, Apple Watch 10, AirPods 4 and more\",\n \"source\": {\n \"name\": \"Tom's Guide\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/YwroNBJq4UKY_6hH7n50b5Fnc3YEroWUN9CgsQG7p4WAvyJpTsXRG6taE0Te0iJafGqtei-zG_E\",\n \"authors\": [\n \"Mark Spoonauer\",\n \"Philip Michaels\"\n ]\n },\n \"link\": \"https:\/\/www.tomsguide.com\/phones\/live\/apple-glowtime-event-iphone-16\",\n \"thumbnail\": \"https:\/\/cdn.mos.cms.futurecdn.net\/s2znttdiicQPAfCNSmVwcZ-320-80.jpg\",\n \"date\": \"09\/12\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 85,\n \"title\": \"Apple Vision Pro available in the U.S. on February 2\",\n \"source\": {\n \"name\": \"Apple\",\n \"icon\": \"https:\/\/encrypted-tbn2.gstatic.com\/faviconV2?url=https:\/\/www.apple.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\"\n },\n \"link\": \"https:\/\/www.apple.com\/newsroom\/2024\/01\/apple-vision-pro-available-in-the-us-on-february-2\/\",\n \"thumbnail\": \"https:\/\/www.apple.com\/newsroom\/images\/2024\/01\/apple-vision-pro-available-in-the-us-on-february-2\/article\/Apple-Vision-Pro-availability-hero_big.jpg.large.jpg\",\n \"date\": \"01\/08\/2024, 08:00 AM, +0000 UTC\"\n },\n {\n \"position\": 86,\n \"title\": \"Apple Loop: RCS Messaging Tested, Refreshed Apple Watch Design, New Apple TV Appears\",\n \"source\": {\n \"name\": \"Forbes\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/NIjzR9QHtZJllEvJIVkODXFQ7_rbx1BMBXx2rNUbttjuu9YWLIp2_juQaI9jJ2rDtzi6snbZ\",\n \"authors\": [\n \"Ewan Spence\"\n ]\n },\n \"link\": \"https:\/\/www.forbes.com\/sites\/ewanspence\/2024\/07\/07\/apple-news-headlines-iphone-16-pro-a17-apple-watch-iphone-battery-replacement-ai-rcs\/\",\n \"thumbnail\": \"https:\/\/imageio.forbes.com\/specials-images\/imageserve\/668869a8069becf14d815a6d\/Apple-Holds-Launch-Event-For-New-Products-At-Its-Headquarters\/960x0.jpg?height=489&width=711&fit=bounds\",\n \"date\": \"07\/07\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 87,\n \"title\": \"Apple announces more than 600 new apps built for Apple Vision Pro\",\n \"source\": {\n \"name\": \"Apple\",\n \"icon\": \"https:\/\/encrypted-tbn2.gstatic.com\/faviconV2?url=https:\/\/www.apple.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\"\n },\n \"link\": \"https:\/\/www.apple.com\/newsroom\/2024\/02\/apple-announces-more-than-600-new-apps-built-for-apple-vision-pro\/\",\n \"thumbnail\": \"https:\/\/www.apple.com\/newsroom\/videos\/app-experiences-visionos-home\/posters\/Apple-Vision-Pro-app-experiences-visionOS-home.jpg.large_2x.jpg\",\n \"date\": \"02\/01\/2024, 08:00 AM, +0000 UTC\"\n },\n {\n \"position\": 88,\n \"title\": \"Apple renews talks with OpenAI for iPhone generative AI features, Bloomberg News reports\",\n \"source\": {\n \"name\": \"Reuters\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/OzNZmYwP-Zl3sTWa8dzzyws9hou0ZihOGJ_-qanon-1iB5KwyqcHOwPxYZj54cGMZwD5qXui\",\n \"authors\": [\n \"Jyoti Narayan\",\n \"Leslie Adler\"\n ]\n },\n \"link\": \"https:\/\/www.reuters.com\/technology\/apple-renews-talks-with-openai-iphone-generative-ai-features-bloomberg-news-2024-04-26\/\",\n \"thumbnail\": \"https:\/\/cloudfront-us-east-2.images.arcpublishing.com\/reuters\/HYCXJR2ZKZKPLLNARTFDHTQSJA.jpg\",\n \"date\": \"04\/26\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 89,\n \"title\": \"Apple juice sold by retailers including Aldi and Walmart recalled due to arsenic concerns\",\n \"source\": {\n \"name\": \"CBS News\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/dXy0k7AMf-wXfnj2AtaLk3rZcPGjClkFvKSAQnjoLp9wa_ggxST_WSGqovh984zY8mf3vDmt\",\n \"authors\": [\n \"Kate Gibson\"\n ]\n },\n \"link\": \"https:\/\/www.cbsnews.com\/news\/apple-juice-recall-arsenic-walmart-aldis-bjs-walgreens\/\",\n \"thumbnail\": \"https:\/\/assets2.cbsnewsstatic.com\/hub\/i\/r\/2011\/12\/01\/7beebb29-1c4f-11e3-9918-005056850598\/thumbnail\/1200x630\/394b8672a02ac81fd818d4f0611327c4\/arsenicapple-AP110915069204.jpg?v=0736ad3ef1e9ddfe1218648fe91d6c9b\",\n \"date\": \"09\/09\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 90,\n \"title\": \"Apple stock finishes flat following Q3 earnings despite a decline in iPhone sales\",\n \"source\": {\n \"name\": \"Yahoo Finance\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/L57n4HUzUS8lNXBPYNGQScsyxaqqx42Nym3-tUk8NzkTvMsa95NhzEqC8KMqVPFpAFpCuPFdlA\",\n \"authors\": [\n \"Daniel Howley\"\n ]\n },\n \"link\": \"https:\/\/finance.yahoo.com\/news\/apple-stock-finishes-flat-following-q3-earnings-despite-a-decline-in-iphone-sales-203352033.html\",\n \"thumbnail\": \"https:\/\/s.yimg.com\/ny\/api\/res\/1.2\/UB2CE5r7wOqKYh6gOymUeg--\/YXBwaWQ9aGlnaGxhbmRlcjt3PTY0MDtoPTQ1Ng--\/https:\/\/s.yimg.com\/os\/creatr-uploaded-images\/2024-06\/99fd5420-275e-11ef-b769-0adc783842cf\",\n \"date\": \"08\/02\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 91,\n \"title\": \"Apple lays off about 100 services employees across Apple Books, News\",\n \"source\": {\n \"name\": \"AppleInsider\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/ebDrbQJlmlbWRl1n42d3GkGpbRxOgKsH56CZw6ewxtjMY8svmE6ikcnAPR6n_lVYEOkPB61O\",\n \"authors\": [\n \"Wesley Hilliard\"\n ]\n },\n \"link\": \"https:\/\/appleinsider.com\/articles\/24\/08\/28\/apple-lays-off-about-100-services-jobs-across-apple-books-news\",\n \"thumbnail\": \"https:\/\/photos5.appleinsider.com\/gallery\/60837-125270-Apple-Books-xl.jpg\",\n \"date\": \"08\/28\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 92,\n \"title\": \"US v. Apple: everything you need to know\",\n \"source\": {\n \"name\": \"The Verge\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/vkRH5gyHtLcKAoRSFHK1ATEgKtHDXoi9iRKKOdVhOng8g7qF2_QCVT1f11q_y_4y95_PY5VzWQ\",\n \"authors\": [\n \"Victoria Song\"\n ]\n },\n \"link\": \"https:\/\/www.theverge.com\/24107581\/doj-v-apple-antitrust-monoply-news-updates\",\n \"thumbnail\": \"https:\/\/i.ytimg.com\/vi\/MI1TlBfPjQs\/maxresdefault.jpg\",\n \"date\": \"08\/01\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 93,\n \"title\": \"Apple Loop: iPhone 16 Pro Software Revealed, Tim Cook\u2019s AI Worries, Apple Blocks PC Emulation\",\n \"source\": {\n \"name\": \"Forbes\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/NIjzR9QHtZJllEvJIVkODXFQ7_rbx1BMBXx2rNUbttjuu9YWLIp2_juQaI9jJ2rDtzi6snbZ\",\n \"authors\": [\n \"Ewan Spence\"\n ]\n },\n \"link\": \"https:\/\/www.forbes.com\/sites\/ewanspence\/2024\/06\/14\/apple-news-headlines-wwdc-iphone-16-pro-ios-18-apple-intelligence-ai\/\",\n \"thumbnail\": \"https:\/\/imageio.forbes.com\/specials-images\/imageserve\/666cdc3b3e6b870795caf100\/US-IT-COMPUTERS-TELECOMMUNICATION-APPLE\/960x0.jpg?height=472&width=711&fit=bounds\",\n \"date\": \"06\/14\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 94,\n \"title\": \"Apple iPhone sales plunge, as shares rise on dividend, stock buyback news\",\n \"source\": {\n \"name\": \"Al Jazeera English\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/l-Ps9rkWuApN8G3MB5uZC_a5G7iKCTITjMdpZFhm2rQf3U2M2Yr_KTYpzpmOPxDiUKgb9yN9ha8\"\n },\n \"link\": \"https:\/\/www.aljazeera.com\/economy\/2024\/5\/3\/apple-iphone-sales-plunge-as-shares-rise-on-dividend-stock-buyback-news\",\n \"thumbnail\": \"https:\/\/www.aljazeera.com\/wp-content\/uploads\/2024\/05\/AP24116703740413-1714696029_6af239-1714700322.jpg?resize=1200%2C630&quality=80\",\n \"date\": \"05\/03\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 95,\n \"title\": \"Apple WWDC 2024 Live Blog: All the News as It Happens\",\n \"source\": {\n \"name\": \"WIRED\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/glGHGpbYzksKAWY0zPxk7YYJrqE5FF5dALI27SaNZaeqEoUhgEUH4vo_DX00DRdkEjcVJCQkmNA\"\n },\n \"link\": \"https:\/\/www.wired.com\/live\/apple-wwdc-2024-live-blog\/\",\n \"thumbnail\": \"https:\/\/media.wired.com\/photos\/66638183805d7fd0338ae567\/master\/w_1280%2Cc_limit\/WWDC-Live-Blog-Gear-GettyImages-1258464919.jpg\",\n \"date\": \"06\/10\/2024, 10:01 AM, +0000 UTC\"\n },\n {\n \"position\": 96,\n \"title\": \"How to Turn Off Annoying Apple TV Sports Notifications\",\n \"source\": {\n \"name\": \"PCMag\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/ayu6HNJcgzsC2c6JZnG6pEUI7oJ_DbiHoRxecNd8OUpY7r9r8hY4ZIDk2y765p5W50H_J8jkooM\",\n \"authors\": [\n \"Tyler L Hayes\"\n ]\n },\n \"link\": \"https:\/\/www.pcmag.com\/how-to\/how-to-turn-off-annoying-apple-tv-sports-notifications\",\n \"thumbnail\": \"https:\/\/i.pcmag.com\/imagery\/articles\/00f32HhpjRdizD1JHL1iHkJ-2..v1724174129.png\",\n \"date\": \"09\/03\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 97,\n \"title\": \"Five changes to expect with Apple\u2019s new M4 Macs next month\",\n \"source\": {\n \"name\": \"9to5Mac\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/_yU7TVFBBY59lFTGF_gB-G6AZql5gRMNflxhEDwVjLtWfN6Xh6JPnPNqKAJO75h_BLghOkzYPw\",\n \"authors\": [\n \"Michael Burkhardt\"\n ]\n },\n \"link\": \"https:\/\/9to5mac.com\/m4-mac-upgrades\/\",\n \"thumbnail\": \"https:\/\/9to5mac.com\/wp-content\/uploads\/sites\/6\/2024\/08\/m4-macs-when.jpg?quality=82&strip=all&w=1600\",\n \"date\": \"09\/22\/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 98,\n \"title\": \"Apple Glowtime as it happened \u2013 iPhone 16, Apple Watch Series 10, an AirPods 4 ANC surprise, plus AI news and more\",\n \"source\": {\n \"name\": \"TechRadar\",\n \"icon\": \"https:\/\/lh3.googleusercontent.com\/h3jba9VMZkFHG1QVakElUh94ugAfWEJfnBwg-v1YYuGEsB7Xo0Na9-1HSp2RTIvArgKT-D_A5g\",\n \"authors\": [\n \"Philip Berne\"\n ]\n },\n \"link\": \"https:\/\/www.techradar.com\/news\/live\/apple-glowtime-iphone-16-launch-live-blog\",\n \"thumbnail\": \"https:\/\/cdn.mos.cms.futurecdn.net\/CJpUvbRSG5TzEPybPZqM4i-1200-80.jpg\",\n \"date\": \"09\/09\/2024, 07:00 AM, +0000 UTC\"\n }\n ],\n \"menu_links\": [\n {\n \"title\": \"U.S.\",\n \"topic_token\": \"CAAqIggKIhxDQkFTRHdvSkwyMHZNRGxqTjNjd0VnSmxiaWdBUAE\",\n \"serpapi_link\": \"https:\/\/serpapi.com\/search.json?engine=google_news&topic_token=CAAqIggKIhxDQkFTRHdvSkwyMHZNRGxqTjNjd0VnSmxiaWdBUAE\"\n },\n {\n \"title\": \"World\",\n \"topic_token\": \"CAAqJggKIiBDQkFTRWdvSUwyMHZNRGx1YlY4U0FtVnVHZ0pWVXlnQVAB\",\n \"serpapi_link\": \"https:\/\/serpapi.com\/search.json?engine=google_news&topic_token=CAAqJggKIiBDQkFTRWdvSUwyMHZNRGx1YlY4U0FtVnVHZ0pWVXlnQVAB\"\n },\n {\n \"title\": \"Your local news\",\n \"topic_token\": \"CAAqHAgKIhZDQklTQ2pvSWJHOWpZV3hmZGpJb0FBUAE\",\n \"serpapi_link\": \"https:\/\/serpapi.com\/search.json?engine=google_news&topic_token=CAAqHAgKIhZDQklTQ2pvSWJHOWpZV3hmZGpJb0FBUAE\"\n },\n {\n \"title\": \"Business\",\n \"topic_token\": \"CAAqJggKIiBDQkFTRWdvSUwyMHZNRGx6TVdZU0FtVnVHZ0pWVXlnQVAB\",\n \"serpapi_link\": \"https:\/\/serpapi.com\/search.json?engine=google_news&topic_token=CAAqJggKIiBDQkFTRWdvSUwyMHZNRGx6TVdZU0FtVnVHZ0pWVXlnQVAB\"\n },\n {\n \"title\": \"Technology\",\n \"topic_token\": \"CAAqJggKIiBDQkFTRWdvSUwyMHZNRGRqTVhZU0FtVnVHZ0pWVXlnQVAB\",\n \"serpapi_link\": \"https:\/\/serpapi.com\/search.json?engine=google_news&topic_token=CAAqJggKIiBDQkFTRWdvSUwyMHZNRGRqTVhZU0FtVnVHZ0pWVXlnQVAB\"\n },\n {\n \"title\": \"Entertainment\",\n \"topic_token\": \"CAAqJggKIiBDQkFTRWdvSUwyMHZNREpxYW5RU0FtVnVHZ0pWVXlnQVAB\",\n \"serpapi_link\": \"https:\/\/serpapi.com\/search.json?engine=google_news&topic_token=CAAqJggKIiBDQkFTRWdvSUwyMHZNREpxYW5RU0FtVnVHZ0pWVXlnQVAB\"\n },\n {\n \"title\": \"Sports\",\n \"topic_token\": \"CAAqJggKIiBDQkFTRWdvSUwyMHZNRFp1ZEdvU0FtVnVHZ0pWVXlnQVAB\",\n \"serpapi_link\": \"https:\/\/serpapi.com\/search.json?engine=google_news&topic_token=CAAqJggKIiBDQkFTRWdvSUwyMHZNRFp1ZEdvU0FtVnVHZ0pWVXlnQVAB\"\n },\n {\n \"title\": \"Science\",\n \"topic_token\": \"CAAqJggKIiBDQkFTRWdvSUwyMHZNRFp0Y1RjU0FtVnVHZ0pWVXlnQVAB\",\n \"serpapi_link\": \"https:\/\/serpapi.com\/search.json?engine=google_news&topic_token=CAAqJggKIiBDQkFTRWdvSUwyMHZNRFp0Y1RjU0FtVnVHZ0pWVXlnQVAB\"\n },\n {\n \"title\": \"Health\",\n \"topic_token\": \"CAAqIQgKIhtDQkFTRGdvSUwyMHZNR3QwTlRFU0FtVnVLQUFQAQ\",\n \"serpapi_link\": \"https:\/\/serpapi.com\/search.json?engine=google_news&topic_token=CAAqIQgKIhtDQkFTRGdvSUwyMHZNR3QwTlRFU0FtVnVLQUFQAQ\"\n }\n ]\n}" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-cfec9d7d5277386c7e0255e1ca7e2d1e.json b/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-cfec9d7d5277386c7e0255e1ca7e2d1e.json deleted file mode 100644 index 60b4e02..0000000 --- a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-cfec9d7d5277386c7e0255e1ca7e2d1e.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:29:51 GMT", - "Content-Type": "application/json", - "Content-Length": "984", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "3500", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1993311", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "200ms", - "x-request-id": "req_3a530427f3fb5275abad4a947b50a520", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=P5A2Tt3SPQe09fylK18LXp_X18CSdW2W_K9CyW6az7k-1729560591-1.0.1.1-Tb0GsT0L08GV4n093qOD7l3f5XT4KeQX7Pg0.rH3yixQHdHyDCd_B91FEMVhUwiwOhMV20IVGOCBzIav9zdpfA; path=/; expires=Tue, 22-Oct-24 01:59:51 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=DrMJZMwqUov3e.Pph5RNGJuNyG3rxjlgJH7QhN3U51Y-1729560591407-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b7e95b5842c7-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKy0SUHFvtoKtSXDzBPscbArm1BU6\",\n \"object\": \"chat.completion\",\n \"created\": 1729560588,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Current headlines about Apple include news about potential discontinuation of some products, sales predictions for the iPhone 16 series based on Apple Intelligence, and technical updates like iOS 18 patches. There is also speculation about an Apple event titled 'Glowtime' which could feature iPhone 16 announcements.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 8688,\n \"completion_tokens\": 70,\n \"total_tokens\": 8758,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-30b3c5e13ad916219ec1fbbc2983cb19.json b/tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-30b3c5e13ad916219ec1fbbc2983cb19.json deleted file mode 100644 index 9d95aa9..0000000 --- a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-30b3c5e13ad916219ec1fbbc2983cb19.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Fri, 04 Oct 2024 13:23:34 GMT", - "Content-Type": "application\/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AEcZIy3kcciUa0zUG7KuoFOodah0h\",\n \"object\": \"chat.completion\",\n \"created\": 1728048212,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Joe Biden is the current President of the United States.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 990,\n \"completion_tokens\": 23,\n \"total_tokens\": 1013,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_68a5bb159e\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-4d9c37b83db9353afd0462b60417eb0e.json b/tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-4d9c37b83db9353afd0462b60417eb0e.json deleted file mode 100644 index eb8b89f..0000000 --- a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-4d9c37b83db9353afd0462b60417eb0e.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Fri, 04 Oct 2024 13:23:29 GMT", - "Content-Type": "application/json", - "Transfer-Encoding": "chunked" - }, - "data": "{\n \"id\": \"chatcmpl-AEcZEh4VMlWjv13MdfSnmAgsuaqj4\",\n \"object\": \"chat.completion\",\n \"created\": 1728048208,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_C07gaoUOMhiHriWgmrS9fz0K\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"serp_a_p_i_google_search_tool\",\n \"arguments\": \"{\\\"query\\\":\\\"current president of the United States\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 166,\n \"completion_tokens\": 25,\n \"total_tokens\": 191,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_82bed303cf\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-8c4de06e2a7064e26c30dd1131e7c149.json b/tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-8c4de06e2a7064e26c30dd1131e7c149.json deleted file mode 100644 index f288fa6..0000000 --- a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-8c4de06e2a7064e26c30dd1131e7c149.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:29:53 GMT", - "Content-Type": "application\/json", - "Content-Length": "954", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "1247", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999865", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "4ms", - "x-request-id": "req_70eaa38447b73c31413c67d7bbf1f47d", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=7eHWmAyfGzR6juUCfyuBeN99c8KHPXfHWfyUvZuhKtI-1729560593-1.0.1.1-7ofygxNEZ0A2b0fgEQi0NLEWP5Lrr0ZmG1deBuyWXVMk_T0P8LrFJ_IKxo_aVGoqYSKHJSmHEg_t3r2mhXiBzQ; path=\/; expires=Tue, 22-Oct-24 01:59:53 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=9sZGvKFjmix0xrHzhPzBokXwrBJObGreU7eHjSjLYkw-1729560593486-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b8049d5e4263-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKy0WZlI3LQD1CiU5jqMS42NdRl5K\",\n \"object\": \"chat.completion\",\n \"created\": 1729560592,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_D1ZxYXnRzUQYd8s2Ax6NyYRY\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"serp_a_p_i_google_search_tool\",\n \"arguments\": \"{\\\"query\\\":\\\"current president of the United States\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 201,\n \"completion_tokens\": 25,\n \"total_tokens\": 226,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_ba97e70e7c\"\n}\n" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-Tool.json b/tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-Tool.json deleted file mode 100644 index 529d534..0000000 --- a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-Tool.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Fri, 04 Oct 2024 13:23:32 GMT", - "Content-Type": "application\/json; charset=utf-8", - "Content-Length": "47290", - "Connection": "keep-alive" - }, - "data": "{\n \"search_metadata\": {\n \"id\": \"66ffec51a47167fa26c5db81\",\n \"status\": \"Success\",\n \"json_endpoint\": \"https:\/\/serpapi.com\/searches\/994a79c8b3a78975\/66ffec51a47167fa26c5db81.json\",\n \"created_at\": \"2024-10-04 13:23:29 UTC\",\n \"processed_at\": \"2024-10-04 13:23:29 UTC\",\n \"google_url\": \"https:\/\/www.google.com\/search?q=current+president+of+the+United+States&oq=current+president+of+the+United+States&num=10&sourceid=chrome&ie=UTF-8\",\n \"raw_html_file\": \"https:\/\/serpapi.com\/searches\/994a79c8b3a78975\/66ffec51a47167fa26c5db81.html\",\n \"total_time_taken\": 2.2\n },\n \"search_parameters\": {\n \"engine\": \"google\",\n \"q\": \"current president of the United States\",\n \"google_domain\": \"google.com\",\n \"num\": \"10\",\n \"device\": \"desktop\"\n },\n \"search_information\": {\n \"query_displayed\": \"current president of the United States\",\n \"total_results\": 933000000,\n \"time_taken_displayed\": 0.33,\n \"organic_results_state\": \"Results for exact spelling\"\n },\n \"knowledge_graph\": {\n \"title\": \"Joe Biden\",\n \"type\": \"46th U.S. President\",\n \"entity_type\": \"people, athlete\",\n \"kgmid\": \"\/m\/012gx2\",\n \"knowledge_graph_search_link\": \"https:\/\/www.google.com\/search?kgmid=\/m\/012gx2&hl=en-US&q=Joe+Biden\",\n \"serpapi_knowledge_graph_search_link\": \"https:\/\/serpapi.com\/search.json?device=desktop&engine=google&google_domain=google.com&hl=en-US&kgmid=%2Fm%2F012gx2&num=10&q=Joe+Biden\",\n \"header_images\": [\n {\n \"image\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/f4afd08ef7d734dfde462b72c068d72ff721367a6a963c1c33219bfea7e2189bb33f1d4aaa5d5d5d.webp\"\n },\n {\n \"image\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/f4afd08ef7d734dfde462b72c068d72ff721367a6a963c1c022521bc1dc5865de85622dc2659e003.webp\"\n },\n {\n \"image\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/f4afd08ef7d734dfde462b72c068d72ff721367a6a963c1c53016c9f19cd71f8e72ab813f5ca518b.webp\"\n }\n ],\n \"website\": \"https:\/\/www.whitehouse.gov\/administration\/president-biden\/\",\n \"born\": \"November 20, 1942 (age 81 years), Scranton, PA\",\n \"born_links\": [\n {\n \"text\": \"Scranton, PA\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=Scranton&si=ACC90nyvvWro6QmnyY1IfSdgk5wwjB1r8BGd_IWRjXqmKPQqm2EZLCY33SRJUwAbMyILe9ZYvWR48da73TEAYEa-DWofQ_zzM8YXtrrAuKdRdz8_jwERmQ54VngswC6NGdVm-Uw7JUkpoo9GjfXwDkQBXLO0pQ5R9L8mVAd4zGJqjD9EyBowzC_A1wzmYHlyoqdIwojtRD4S&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQmxMoAHoECDQQAg\"\n }\n ],\n \"organizations_founded\": \"United States Department of Defense China Task Force\",\n \"organizations_founded_links\": [\n {\n \"text\": \"United States Department of Defense China Task Force\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=United+States+Department+of+Defense+China+Task+Force&si=ACC90nwLLwns5sISZcdzuISy7t-NHozt8Cbt6G3WNQfC9ekAgE1g6nlV1psrsA6W4s4OrKxpg_xQ7PHcADkxSX4GwDRYKYLgPz-0tSPsvrY_Dfc3LU8IWO5gOEKWpnN-kQLDikUYyAc2w_nYLwFXC1q5zk_-yNZUDNcT2fp9NWpUng12JeSndTELHmXP2n34vehcNTydlSasILmb6mTRqAdsbdNlrt-ZePnRCBF1iEaEtYnGt_vvUFSkkM_d9Rmuf3vZnZzBXWwHy07j7gWRu-R2ACqA-bUj0vaporPDbMXGttRr_mYS7Ij8ly-O78dfB1Ok8QX79jYhoActb0qKcBMNAtnL8Dk_AkKqdoXpc8fkn1XgFxEgxl0%3D&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQmxMoAHoECC4QAg\"\n },\n {\n \"text\": \"See more\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=joe+biden+organizations+founded&stick=H4sIAAAAAAAAAOPgE-LUz9U3MDRKrzDSsswot9JPzs_JSU0uyczP088vSk_My6xKBHHi0_JL81JSi4qtIIwUBWTZRazyWfmpCkmZKal5KBLFClDlAN6zbvNqAAAA&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQ44YBKAF6BAguEAM\"\n }\n ],\n \"grandchildren\": \"Navy Joan Roberts, Finnegan Biden, Maisy Biden, Natalie Biden, Naomi Biden, Robert Biden II\",\n \"grandchildren_links\": [\n {\n \"text\": \"Navy Joan Roberts\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=Navy+Joan+Roberts&si=ACC90nwLLwns5sISZcdzuISy7t-NHozt8Cbt6G3WNQfC9ekAgGBO1k0Fw9J7eiXIAluOC-h3x9kWnCEJLYw0la7WK3Omp0d2JsScWW1rQ8_czyUaObhJJ0A_Jn5HfPbr0fCcfno6x_j1bMCZqQO1y_Jd11erbDSEEFYImHvmpum7-D-aa6A_aSUDCVinnG6yFGURviXPRELfldPI7m1GsNkmX0lHQfiWFDw8GzcYQyT_vUrof8-zLFqxUPdWlsnky-eGa_4x30pTZwZsPkdqkWMzPNRR84_1xUrRMvuBL9Ah-EDa7gsVvg0%3D&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQmxMoAHoECCwQAg\"\n },\n {\n \"text\": \"Finnegan Biden\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=Finnegan+Biden&si=ACC90ny8E30vD16OoPAAI4cStfcliGy35W8UAhb0TsHNc_ISQauVu4G0hIQv7fc43FGsjhKZTj_XUbYWBwbsWuegUqJCbp21rtbRxSZB-CZ61IZpFGStoWH1WtSZfgBWTqBxZ1EN2MdUzCeNseI7lv_h85TY5-WL_LjYQSkdLOesnmfUCWEB96Ro53WQEzvUaa-fLt3V4jj9NjD4BNgWl9AxuYWv7awPnEGC7KlLgX1jHXIOMHnJc2T_8KvENhCN_UGb7z-dV_-6lys7vbLSRjpQbuNlixaCYg%3D%3D&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQmxMoAXoECCwQAw\"\n },\n {\n \"text\": \"Maisy Biden\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=Maisy+Biden&si=ACC90ny8E30vD16OoPAAI4cStfcliGy35W8UAhb0TsHNc_ISQUcR8mmtY-_S5_nyD-HJlhyanoVc___KFVbmfkFHDuBodfjyQW3Zb5nV0OXlHbmmrJfwE9n2Y-uNjTuygS7rl1VwBSenl4Rh0A1MeWwvacWXjeZPKFCe6AUeMf-5v6Y8Dd0fJzbdkXZy_38tpvivSyvIrWs5ANyFnpjvdyxDjC3AmGHrqqbAncI0YxpsMwQL2qC_djqi9AIRq7B6uY7O6TQf8fAVp1CrVAhbIGy7ycLbjyMpMw%3D%3D&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQmxMoAnoECCwQBA\"\n },\n {\n \"text\": \"Natalie Biden\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=Natalie+Biden&si=ACC90ny8E30vD16OoPAAI4cStfcliGy35W8UAhb0TsHNc_ISQeHc8_rzepqdBr3oHPWyn600qOsJHsKvQx4I2FIdKctMlaBfqNUTar5Y1BbcrM8jQv1G0257jwiJQzw5RK2u5qq6fP3ZXJP7gkPyeliAEMrOXISWutlszhADGKQfqsGd7Gq166w2f6UdHhazPDw5L0I43Uvk0oOmDNLHB5WY8HCm7AML__j7mCKwnZWi4_K2Jlp0gD3t0wCDnp-xNxUE__QFK_UrD9HTWfq_u5EIVwxx4Gfw2w%3D%3D&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQmxMoA3oECCwQBQ\"\n },\n {\n \"text\": \"Naomi Biden\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=Naomi+Biden&si=ACC90ny8E30vD16OoPAAI4cStfcliGy35W8UAhb0TsHNc_ISQUCnqIBK-OChIi9DYVRUllksDLLsauXRg6UAPslNKKJV5A1Nlmur75Xh7A2L_FQvKE7HjKvg6qADyRybOZZE1y6CxbX83c7ejYOvWO4SuYqouenZkKCv05Men-Z-fb_kdHSx9Mw8HiyY7vkIKGBvYb28d8TR--R8hcU0oMcRMysKgC0r7Uo7BCHqmgRxWJ5R7wo8ncbrtMzR8z754Hg3h7z2qP90yf_YEkoc2pKPWY50nsEZlQ%3D%3D&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQmxMoBHoECCwQBg\"\n },\n {\n \"text\": \"Robert Biden II\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=Robert+Biden+II&si=ACC90ny8E30vD16OoPAAI4cStfcliGy35W8UAhb0TsHNc_ISQREBJUEQ3-xrOz-cJiODYcOGvbRLeGq7VeV_FiFRquSupTOTNogbd_iqTwfJ-szApTTtfrIf7wbXHZhStwAtp5H8W7qxLG24SIWP_HwN35iwmMFNX8o6XxmJHbYAAOtGlCmZ1QfgD0o43kqV3NO9xjz87lBmkjL5lj0FUxzUVhxF_B3zVROgdHvWUXnRoLUJaIScCwhtiH60zsPEI2s5GfmGMVHeGi42bSgWIWjf75USq57MOg%3D%3D&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQmxMoBXoECCwQBw\"\n }\n ],\n \"grandparents\": \"Mary Elizabeth Robinette Biden, Ambrose J. Finnegan, Joseph H. Biden, Geraldine C. Blewitt\",\n \"grandparents_links\": [\n {\n \"text\": \"Mary Elizabeth Robinette Biden\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=Mary+Elizabeth+Robinette+Biden&si=ACC90nwLLwns5sISZcdzuISy7t-NHozt8Cbt6G3WNQfC9ekAgBHJLIINkT9aYXgbtFPvgQd-kcQhwFRMti1rgpedDgJKsFFmZIBJtpsK-sYE2Ypi9dkqq-y1YEcgstxi8-N-JWFzPrfO3ROmGxU_42LMKOYTabKn84QGP3BNMA_fJxl9ffDCrf5yx_xa066sXUtXCwcbdah0krNAOvCST4CEgMvKZ5iT3a6a4EScH8o8x005cnbzQgi1IxBq3x619kFxh37tBxcNwobfpMHSeL2n3xjVGlbnjGyVh85H3Fr06k15-jKc-iKx3qfuvDtN6EzzfQyJel-L&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQmxMoAHoECC0QAg\"\n },\n {\n \"text\": \"Ambrose J. Finnegan\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=Ambrose+J.+Finnegan&si=ACC90nyByJNAHfkzzi7l4JA4fcQKXOYDCI7plJH6uVksGWg6XlUrE1PCCLclo11PpDvum35_ZMMXAUBFFECIbLX_us44wGRV1HqgapndcDM7WJwspW4isSVTTukZ21DYgWLvNIAZS0ygJ_YXzlk35rbYjSCYaVtwMVMC4nOzeY9E3jqW9oB_3cAnNAeyTDOYmgmUhUEp2LLXTGmIyZnBrNYh6Q7uTD0oSuqvQVXn4QziiBqKdK9i6LYxhXAr-RudIQHSgbYfiKf5SiL_PztJZCFpo_a1MV0obPIHixTCTPqSCEHGjNEbpA8%3D&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQmxMoAXoECC0QAw\"\n },\n {\n \"text\": \"Joseph H. Biden\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=Joseph+H.+Biden&si=ACC90nwLLwns5sISZcdzuISy7t-NHozt8Cbt6G3WNQfC9ekAgHbh__85qw2jT4PRA4VjIRAIQz1HP1CGkEXFqJAGVGnsWpApd7QnfucVtTnXdpXaxIclEZb2O8KTykrxITGnkKo9mxwKxNg09vKJQiWbz32dv2_GSqRxDAB0cn3Iq2lesx0jLEl8AGMjk5Alyt5Y95QOUnViTHc--51cqqSz4cxWoVwGNIpsoUj3kg60vPZOxGK8zqWeOlNDPbAmyaOyI5qQfgYiKVmRjozLhtYOPTWOjOUSBSnvVXmhHBtEtl3hSbPGsc4%3D&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQmxMoAnoECC0QBA\"\n },\n {\n \"text\": \"Geraldine C. Blewitt\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=Geraldine+C.+Blewitt&si=ACC90nyByJNAHfkzzi7l4JA4fcQKXOYDCI7plJH6uVksGWg6XjCvpGreiIu5eQP4ovnI7FAryP2eZx77OnNzOoDThI4LaSMvhXSz-mFsaRUyIOcLrbOx234IktXZbSxPC5QWpQ-Cti1A5w4PS3jnPzU1kJX61vHhntzGr-ceNxcT3mXAihg0FYSmyLx3yFicxpeWeYwrjSBh06Om5VmIMfAd5tDJ7PClobwz02Mr0FwK5cC1RXPIkX-Yii5DD86Pivyc5Hg046eOeCtNMrNu7cSe9kfhIhz_-yYEnfNGwGVOKTgMvUjflFI%3D&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQmxMoA3oECC0QBQ\"\n }\n ],\n \"great_grandparents\": \"George Hamilton Robinette\",\n \"great_grandparents_links\": [\n {\n \"text\": \"George Hamilton Robinette\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=George+Hamilton+Robinette&si=ACC90nwLLwns5sISZcdzuISy7t-NHozt8Cbt6G3WNQfC9ekAgMruhyMP5hzcLaEIFEatpTbCu8jln0IwloowvnNb9QsoKR39hk5KGsJhlpcyDxymTavyI7AcFFsYLjenfJa-f9tv0CH296bGxtreGcN8aiA0YZ3takCS1Uqq7pnedL3CpY1hVM7v8TzJPdU_c0lkl4QPLBGwdkcI5JuIjfB6mL83H0-C5-FbXpp_gged4Q-00B43Sd_xDr_ScZh8JfyK6ToHqp4irVTJuea9fUahKpMTntbBoKTq50hvcVl2ZOUyDjyHnFmLdS3JjxvkTBmW0-gvawyZ&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQmxMoAHoECCsQAg\"\n },\n {\n \"text\": \"See more\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=joe+biden+great-grandparents&stick=H4sIAAAAAAAAAOPgE-LUz9U3MDRKrzDSUs8ot9JPzs_JSU0uyczP0y9IzS_ISbVKL0pNLFFIL0rMSylILErNK1nEKpOVn6qQlJmSmqcAltVFki0GACl-ijhVAAAA&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQ44YBKAF6BAgrEAM\"\n }\n ],\n \"marriage_location\": \"New York, NY\",\n \"marriage_location_links\": [\n {\n \"text\": \"New York, NY\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=New+York&si=ACC90nzx_D3_zUKRnpAjmO0UBLNxnt7EyN4YYdru6U3bxLI-L1vhwciuTHTDerN_6A9Mag4Ax1n3X-zP0_QZjYVvvrpJ15Ktq4_1pqvgj5Xpqei9qJoPo_qejnOk72pQxO_HKknRkPql1r4TYoKbJM0oeVfdhnn_58a43Q9K7Ctns8OMb_-SITD6imX23QcSeJhXtmH7sjqA&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQmxMoAHoECCoQAg\"\n }\n ],\n \"web_results\": [\n {\n \"snippet\": \"Joseph Robinette Biden Jr. is an American politician who has been the 46th and current president of the United States since 2021. A member of the Democratic Party, he served as the 47th vice president from 2009 to 2017 under President Barack Obama and represented Delaware in the U.S. Senate from 1973 to 2009.\",\n \"source\": \"Wikipedia\",\n \"link\": \"https:\/\/en.wikipedia.org\/wiki\/Joe_Biden\"\n },\n {\n \"title\": \"Edited works\",\n \"snippet\": \"Proceedings of the Senate Task Force on Economic Sanctions, Halting the Spread of HIV\/AIDS: Future Efforts in the U. S. Bilateral and Multilateral Response: Congressional Hearings, Anti-Terrorism Conventions: Committee on Foreign Relations, U. S. Senate, Executive Report, Dirty Bombs and Basement Nukes: The Terrorist Nuclear Threat - Congressional Hearing, The Threat of Bioterrorism and the Spread of Infectious Diseases: Congressional Hearing, U. S. Security Interests in Europe: Congressional Hearing, Strategies for Homeland Defense: A Compilation by the Committee Foreign Relations, United States Senate, Hearings to Examine Threats, Responses and Regional Considerations Surrounding Iraq: Congressional Hearings, Green Jobs: A Pathway to a Strong Middle Class, Examining the Theft of American Intellectual Property at Home and Abroad: Congressional Hearing, Reducing the Threat of Chemical and Biological Weapons: Congressional Hearing, The Administration's Missle Defense Program and the ABM Treaty: Congressional Hearing, Putin Administration's Policies Toward Non-Russian Regions of the Russian Federation, How Do We Promote Democratization, Poverty Alleviation, and Human Rights to Build a More Secure Future? Congressional Hearing\"\n },\n {\n \"title\": \"Age\",\n \"snippet\": \"81 years Nov 20, 1942\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=joe+biden+age&stick=H4sIAAAAAAAAAOPgE-LUz9U3MDRKrzDSEs1OttIvSM0vyEkFUkXF-XlWiempi1h5s_JTFZIyU1LzFIB8AMGaH2I0AAAA&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQ18AJegQIPRAB\"\n }\n ],\n \"profiles\": [\n {\n \"name\": \"Instagram\",\n \"link\": \"https:\/\/www.instagram.com\/potus\",\n \"image\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/f4afd08ef7d734dfde462b72c068d72f54032021daa42b287c4a1aaa02e89e7bc44f088a3e6592f3.png\"\n },\n {\n \"name\": \"X (Twitter)\",\n \"link\": \"https:\/\/twitter.com\/JoeBiden\",\n \"image\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/f4afd08ef7d734dfde462b72c068d72f54032021daa42b286cc2bfb7e8859a5bc5e3eb5e73f5f75f.png\"\n },\n {\n \"name\": \"YouTube\",\n \"link\": \"https:\/\/www.youtube.com\/joebiden\",\n \"image\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/f4afd08ef7d734dfde462b72c068d72f54032021daa42b28f1d8a13206f8677a394413172e958b4e.png\"\n },\n {\n \"name\": \"Facebook\",\n \"link\": \"https:\/\/www.facebook.com\/joebiden\",\n \"image\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/f4afd08ef7d734dfde462b72c068d72f54032021daa42b2843eafc655c93486be210b0f3168da841.png\"\n },\n {\n \"name\": \"TikTok\",\n \"link\": \"https:\/\/www.tiktok.com\/@bidenhq\",\n \"image\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/f4afd08ef7d734dfde462b72c068d72f54032021daa42b28deedbe75b7f5cd0a310641b424dc5a3d.png\"\n }\n ]\n },\n \"related_questions\": [\n {\n \"question\": \"Who is the current president of US A?\",\n \"snippet\": \"President Joe Biden in the Oval Office.\",\n \"title\": \"Joe Biden: The President | The White House\",\n \"link\": \"https:\/\/www.whitehouse.gov\/administration\/president-biden\/#:~:text=President%20Joe%20Biden%20in%20the%20Oval%20Office.\",\n \"displayed_link\": \"https:\/\/www.whitehouse.gov \u203a administration \u203a presiden...\",\n \"next_page_token\": \"eyJvbnMiOiIxMDA0MSIsImZjIjoiRW9zQkNreEJTa2M1U210T09FVk5kWEV0TFhsSGNGTnJNMEpWVTBGUU1VcENhM2xCTURoNlpWbDJUbEZIU1VGdGMzWllXbGsxYWtGaE5qRnRUM2RMWkhSQlNYcHhkSFpHUjJ4MWFYSlJWbUV6RWhkVkxYcGZXbll6TmtaaVpWbDNZbXRRZEVwbWNtbEJPQm9pUVVaWWNrVmpjRUp3V0hkNFNGZFZaSEEyYmtKRE5sZFpPV2MyVEVaUmNtWjBVUSIsImZjdiI6IjMiLCJlaSI6IlUtel9adjM2RmJlWXdia1B0SmZyaUE4IiwicWMiOiJDaVpqZFhKeVpXNTBJSEJ5WlhOcFpHVnVkQ0J2WmlCMGFHVWdkVzVwZEdWa0lITjBZWFJsY3hBQVlBRjlQZndzUHciLCJxdWVzdGlvbiI6IldobyBpcyB0aGUgY3VycmVudCBwcmVzaWRlbnQgb2YgVVMgQT8iLCJsayI6ImM1TlNLY19JVjhnc1ZpakpTRlZJTGkwcVNzMHJVU2dvU2kzT1RBR3g4dE1VU29zVkVnRSIsImJzIjoiYy1NSzRsSU56OGhYeUN4V0tNbElWVWd1TFNwS3pTdFJLQ2hLTGM1TUFiSHkweFJDZ3hVYzdTWDJteG1wU2FtVUUxQmJXcXlReU9YRHBRUXlzendSb3JBeXZ6UXZQYlc0QkdRUVhMRzl4QkV0STJVcHhYSnNDb0dtd0JWeTJYQkpRVjJZVjVxYmxGcWtZSWhzU29lMWtiU1VaRGt1QlZ3V1hCSklfbE5HMGZzcDFVaFNTcndjdTdRQUl3QSIsImlkIjoiZmNfMSJ9\",\n \"serpapi_link\": \"https:\/\/serpapi.com\/search.json?device=desktop&engine=google_related_questions&google_domain=google.com&next_page_token=eyJvbnMiOiIxMDA0MSIsImZjIjoiRW9zQkNreEJTa2M1U210T09FVk5kWEV0TFhsSGNGTnJNMEpWVTBGUU1VcENhM2xCTURoNlpWbDJUbEZIU1VGdGMzWllXbGsxYWtGaE5qRnRUM2RMWkhSQlNYcHhkSFpHUjJ4MWFYSlJWbUV6RWhkVkxYcGZXbll6TmtaaVpWbDNZbXRRZEVwbWNtbEJPQm9pUVVaWWNrVmpjRUp3V0hkNFNGZFZaSEEyYmtKRE5sZFpPV2MyVEVaUmNtWjBVUSIsImZjdiI6IjMiLCJlaSI6IlUtel9adjM2RmJlWXdia1B0SmZyaUE4IiwicWMiOiJDaVpqZFhKeVpXNTBJSEJ5WlhOcFpHVnVkQ0J2WmlCMGFHVWdkVzVwZEdWa0lITjBZWFJsY3hBQVlBRjlQZndzUHciLCJxdWVzdGlvbiI6IldobyBpcyB0aGUgY3VycmVudCBwcmVzaWRlbnQgb2YgVVMgQT8iLCJsayI6ImM1TlNLY19JVjhnc1ZpakpTRlZJTGkwcVNzMHJVU2dvU2kzT1RBR3g4dE1VU29zVkVnRSIsImJzIjoiYy1NSzRsSU56OGhYeUN4V0tNbElWVWd1TFNwS3pTdFJLQ2hLTGM1TUFiSHkweFJDZ3hVYzdTWDJteG1wU2FtVUUxQmJXcXlReU9YRHBRUXlzendSb3JBeXZ6UXZQYlc0QkdRUVhMRzl4QkV0STJVcHhYSnNDb0dtd0JWeTJYQkpRVjJZVjVxYmxGcWtZSWhzU29lMWtiU1VaRGt1QlZ3V1hCSklfbE5HMGZzcDFVaFNTcndjdTdRQUl3QSIsImlkIjoiZmNfMSJ9\"\n },\n {\n \"question\": \"Who was the youngest US president?\",\n \"snippet\": \"Age of presidents The youngest person to become U.S. president was Theodore Roosevelt, who, at age 42, succeeded to the office after the assassination of William McKinley. The oldest person inaugurated president was Joe Biden, at the age of 78.\",\n \"title\": \"List of presidents of the United States by age - Wikipedia\",\n \"link\": \"https:\/\/en.wikipedia.org\/wiki\/List_of_presidents_of_the_United_States_by_age#:~:text=Age%20of%20presidents,-Age%20of%20U.S.&text=The%20youngest%20person%20to%20become,at%20the%20age%20of%2078.\",\n \"displayed_link\": \"https:\/\/en.wikipedia.org \u203a wiki \u203a List_of_presidents_of_t...\",\n \"source_logo\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/ad7ee8145e566f1f362fbd875d8257e7aa6eaf65d1ed8283f19c117342d6d7cf.png\",\n \"next_page_token\": \"eyJvbnMiOiIxMDA0MSIsImZjIjoiRW9zQkNreEJTa2M1U210T09FVk5kWEV0TFhsSGNGTnJNMEpWVTBGUU1VcENhM2xCTURoNlpWbDJUbEZIU1VGdGMzWllXbGsxYWtGaE5qRnRUM2RMWkhSQlNYcHhkSFpHUjJ4MWFYSlJWbUV6RWhkVkxYcGZXbll6TmtaaVpWbDNZbXRRZEVwbWNtbEJPQm9pUVVaWWNrVmpjRUp3V0hkNFNGZFZaSEEyYmtKRE5sZFpPV2MyVEVaUmNtWjBVUSIsImZjdiI6IjMiLCJlaSI6IlUtel9adjM2RmJlWXdia1B0SmZyaUE4IiwicWMiOiJDaVpqZFhKeVpXNTBJSEJ5WlhOcFpHVnVkQ0J2WmlCMGFHVWdkVzVwZEdWa0lITjBZWFJsY3hBQVlBRjlQZndzUHciLCJxdWVzdGlvbiI6IldobyB3YXMgdGhlIHlvdW5nZXN0IFVTIHByZXNpZGVudD8iLCJsayI6IkdpRjNhRzhnZDJGeklIUm9aU0I1YjNWdVoyVnpkQ0IxY3lCd2NtVnphV1JsYm5RIiwiYnMiOiJjLU1LNGxJTno4aFh5Q3hXS01sSVZVZ3VMU3BLelN0UktDaEtMYzVNQWJIeTB4UkNneFVjN1NYMm14bXBTYW1VRTFCYldxeVF5T1hEcFFReXN6d1JvckF5dnpRdlBiVzRCR1FRWExHOXhCRXRJMlVweFhKc0NvR213QlZ5MlhCSlFWMllWNXFibEZxa1lJaHNTb2Uxa2JTVVpEa3VCVndXWEJKSV9sTkcwZnNwMVVoU1Nyd2N1N1FBSXdBIiwiaWQiOiJmY18xIn0=\",\n \"serpapi_link\": \"https:\/\/serpapi.com\/search.json?device=desktop&engine=google_related_questions&google_domain=google.com&next_page_token=eyJvbnMiOiIxMDA0MSIsImZjIjoiRW9zQkNreEJTa2M1U210T09FVk5kWEV0TFhsSGNGTnJNMEpWVTBGUU1VcENhM2xCTURoNlpWbDJUbEZIU1VGdGMzWllXbGsxYWtGaE5qRnRUM2RMWkhSQlNYcHhkSFpHUjJ4MWFYSlJWbUV6RWhkVkxYcGZXbll6TmtaaVpWbDNZbXRRZEVwbWNtbEJPQm9pUVVaWWNrVmpjRUp3V0hkNFNGZFZaSEEyYmtKRE5sZFpPV2MyVEVaUmNtWjBVUSIsImZjdiI6IjMiLCJlaSI6IlUtel9adjM2RmJlWXdia1B0SmZyaUE4IiwicWMiOiJDaVpqZFhKeVpXNTBJSEJ5WlhOcFpHVnVkQ0J2WmlCMGFHVWdkVzVwZEdWa0lITjBZWFJsY3hBQVlBRjlQZndzUHciLCJxdWVzdGlvbiI6IldobyB3YXMgdGhlIHlvdW5nZXN0IFVTIHByZXNpZGVudD8iLCJsayI6IkdpRjNhRzhnZDJGeklIUm9aU0I1YjNWdVoyVnpkQ0IxY3lCd2NtVnphV1JsYm5RIiwiYnMiOiJjLU1LNGxJTno4aFh5Q3hXS01sSVZVZ3VMU3BLelN0UktDaEtMYzVNQWJIeTB4UkNneFVjN1NYMm14bXBTYW1VRTFCYldxeVF5T1hEcFFReXN6d1JvckF5dnpRdlBiVzRCR1FRWExHOXhCRXRJMlVweFhKc0NvR213QlZ5MlhCSlFWMllWNXFibEZxa1lJaHNTb2Uxa2JTVVpEa3VCVndXWEJKSV9sTkcwZnNwMVVoU1Nyd2N1N1FBSXdBIiwiaWQiOiJmY18xIn0%3D\"\n },\n {\n \"question\": \"Who is number 1 president?\",\n \"snippet\": \"Abraham Lincoln has taken the highest ranking in each survey and George Washington, Franklin D. Roosevelt, and Theodore Roosevelt have always ranked in the top five while James Buchanan, Andrew Johnson, and Franklin Pierce have been ranked at the bottom of all four surveys.\",\n \"title\": \"Historical rankings of presidents of the United States - Wikipedia\",\n \"link\": \"https:\/\/en.wikipedia.org\/wiki\/Historical_rankings_of_presidents_of_the_United_States#:~:text=Abraham%20Lincoln%20has%20taken%20the,bottom%20of%20all%20four%20surveys.\",\n \"displayed_link\": \"https:\/\/en.wikipedia.org \u203a wiki \u203a Historical_rankings_of_...\",\n \"source_logo\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/ad7ee8145e566f1f362fbd875d8257e73c43d2b0f14d2e591b248ca6ebe30d32.png\",\n \"next_page_token\": \"eyJvbnMiOiIxMDA0MSIsImZjIjoiRW9zQkNreEJTa2M1U210T09FVk5kWEV0TFhsSGNGTnJNMEpWVTBGUU1VcENhM2xCTURoNlpWbDJUbEZIU1VGdGMzWllXbGsxYWtGaE5qRnRUM2RMWkhSQlNYcHhkSFpHUjJ4MWFYSlJWbUV6RWhkVkxYcGZXbll6TmtaaVpWbDNZbXRRZEVwbWNtbEJPQm9pUVVaWWNrVmpjRUp3V0hkNFNGZFZaSEEyYmtKRE5sZFpPV2MyVEVaUmNtWjBVUSIsImZjdiI6IjMiLCJlaSI6IlUtel9adjM2RmJlWXdia1B0SmZyaUE4IiwicWMiOiJDaVpqZFhKeVpXNTBJSEJ5WlhOcFpHVnVkQ0J2WmlCMGFHVWdkVzVwZEdWa0lITjBZWFJsY3hBQVlBRjlQZndzUHciLCJxdWVzdGlvbiI6IldobyBpcyBudW1iZXIgMSBwcmVzaWRlbnQ\/IiwibGsiOiJHaGwzYUc4Z2FYTWdiblZ0WW1WeUlERWdjSEpsYzJsa1pXNTAiLCJicyI6ImMtTUs0bElOejhoWHlDeFdLTWxJVlVndUxTcEt6U3RSS0NoS0xjNU1BYkh5MHhSQ2d4VWM3U1gybXhtcFNhbVVFMUJiV3F5UXlPWERwUVF5c3p3Um9yQXl2elF2UGJXNEJHUVFYTEc5eEJFdEkyVXB4WEpzQ29HbXdCVnkyWEJKUVYyWVY1cWJsRnFrWUloc1NvZTFrYlNVWkRrdUJWd1dYQkpJX2xORzBmc3AxVWhTU3J3Y3U3UUFJd0EiLCJpZCI6ImZjXzEifQ==\",\n \"serpapi_link\": \"https:\/\/serpapi.com\/search.json?device=desktop&engine=google_related_questions&google_domain=google.com&next_page_token=eyJvbnMiOiIxMDA0MSIsImZjIjoiRW9zQkNreEJTa2M1U210T09FVk5kWEV0TFhsSGNGTnJNMEpWVTBGUU1VcENhM2xCTURoNlpWbDJUbEZIU1VGdGMzWllXbGsxYWtGaE5qRnRUM2RMWkhSQlNYcHhkSFpHUjJ4MWFYSlJWbUV6RWhkVkxYcGZXbll6TmtaaVpWbDNZbXRRZEVwbWNtbEJPQm9pUVVaWWNrVmpjRUp3V0hkNFNGZFZaSEEyYmtKRE5sZFpPV2MyVEVaUmNtWjBVUSIsImZjdiI6IjMiLCJlaSI6IlUtel9adjM2RmJlWXdia1B0SmZyaUE4IiwicWMiOiJDaVpqZFhKeVpXNTBJSEJ5WlhOcFpHVnVkQ0J2WmlCMGFHVWdkVzVwZEdWa0lITjBZWFJsY3hBQVlBRjlQZndzUHciLCJxdWVzdGlvbiI6IldobyBpcyBudW1iZXIgMSBwcmVzaWRlbnQ%2FIiwibGsiOiJHaGwzYUc4Z2FYTWdiblZ0WW1WeUlERWdjSEpsYzJsa1pXNTAiLCJicyI6ImMtTUs0bElOejhoWHlDeFdLTWxJVlVndUxTcEt6U3RSS0NoS0xjNU1BYkh5MHhSQ2d4VWM3U1gybXhtcFNhbVVFMUJiV3F5UXlPWERwUVF5c3p3Um9yQXl2elF2UGJXNEJHUVFYTEc5eEJFdEkyVXB4WEpzQ29HbXdCVnkyWEJKUVYyWVY1cWJsRnFrWUloc1NvZTFrYlNVWkRrdUJWd1dYQkpJX2xORzBmc3AxVWhTU3J3Y3U3UUFJd0EiLCJpZCI6ImZjXzEifQ%3D%3D\"\n },\n {\n \"question\": \"Who is the #1 president?\",\n \"snippet\": \"George Washington (February 22, 1732 \u2013 December 14, 1799) was an American Founding Father, politician, military officer, and farmer who served as the first president of the United States from 1789 to 1797.\",\n \"title\": \"George Washington - Wikipedia\",\n \"link\": \"https:\/\/en.wikipedia.org\/wiki\/George_Washington#:~:text=George%20Washington%20(February%2022%2C%201732,States%20from%201789%20to%201797.\",\n \"displayed_link\": \"https:\/\/en.wikipedia.org \u203a wiki \u203a George_Washington\",\n \"source_logo\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/ad7ee8145e566f1f362fbd875d8257e7cbc15e4c5530eec7b29f28251e20a863.png\",\n \"next_page_token\": \"eyJvbnMiOiIxMDA0MSIsImZjIjoiRW9zQkNreEJTa2M1U210T09FVk5kWEV0TFhsSGNGTnJNMEpWVTBGUU1VcENhM2xCTURoNlpWbDJUbEZIU1VGdGMzWllXbGsxYWtGaE5qRnRUM2RMWkhSQlNYcHhkSFpHUjJ4MWFYSlJWbUV6RWhkVkxYcGZXbll6TmtaaVpWbDNZbXRRZEVwbWNtbEJPQm9pUVVaWWNrVmpjRUp3V0hkNFNGZFZaSEEyYmtKRE5sZFpPV2MyVEVaUmNtWjBVUSIsImZjdiI6IjMiLCJlaSI6IlUtel9adjM2RmJlWXdia1B0SmZyaUE4IiwicWMiOiJDaVpqZFhKeVpXNTBJSEJ5WlhOcFpHVnVkQ0J2WmlCMGFHVWdkVzVwZEdWa0lITjBZWFJsY3hBQVlBRjlQZndzUHciLCJxdWVzdGlvbiI6IldobyBpcyB0aGUgIzEgcHJlc2lkZW50PyIsImxrIjoiR2hkM2FHOGdhWE1nZEdobElDTXhJSEJ5WlhOcFpHVnVkQSIsImJzIjoiYy1NSzRsSU56OGhYeUN4V0tNbElWVWd1TFNwS3pTdFJLQ2hLTGM1TUFiSHkweFJDZ3hVYzdTWDJteG1wU2FtVUUxQmJXcXlReU9YRHBRUXlzendSb3JBeXZ6UXZQYlc0QkdRUVhMRzl4QkV0STJVcHhYSnNDb0dtd0JWeTJYQkpRVjJZVjVxYmxGcWtZSWhzU29lMWtiU1VaRGt1QlZ3V1hCSklfbE5HMGZzcDFVaFNTcndjdTdRQUl3QSIsImlkIjoiZmNfMSJ9\",\n \"serpapi_link\": \"https:\/\/serpapi.com\/search.json?device=desktop&engine=google_related_questions&google_domain=google.com&next_page_token=eyJvbnMiOiIxMDA0MSIsImZjIjoiRW9zQkNreEJTa2M1U210T09FVk5kWEV0TFhsSGNGTnJNMEpWVTBGUU1VcENhM2xCTURoNlpWbDJUbEZIU1VGdGMzWllXbGsxYWtGaE5qRnRUM2RMWkhSQlNYcHhkSFpHUjJ4MWFYSlJWbUV6RWhkVkxYcGZXbll6TmtaaVpWbDNZbXRRZEVwbWNtbEJPQm9pUVVaWWNrVmpjRUp3V0hkNFNGZFZaSEEyYmtKRE5sZFpPV2MyVEVaUmNtWjBVUSIsImZjdiI6IjMiLCJlaSI6IlUtel9adjM2RmJlWXdia1B0SmZyaUE4IiwicWMiOiJDaVpqZFhKeVpXNTBJSEJ5WlhOcFpHVnVkQ0J2WmlCMGFHVWdkVzVwZEdWa0lITjBZWFJsY3hBQVlBRjlQZndzUHciLCJxdWVzdGlvbiI6IldobyBpcyB0aGUgIzEgcHJlc2lkZW50PyIsImxrIjoiR2hkM2FHOGdhWE1nZEdobElDTXhJSEJ5WlhOcFpHVnVkQSIsImJzIjoiYy1NSzRsSU56OGhYeUN4V0tNbElWVWd1TFNwS3pTdFJLQ2hLTGM1TUFiSHkweFJDZ3hVYzdTWDJteG1wU2FtVUUxQmJXcXlReU9YRHBRUXlzendSb3JBeXZ6UXZQYlc0QkdRUVhMRzl4QkV0STJVcHhYSnNDb0dtd0JWeTJYQkpRVjJZVjVxYmxGcWtZSWhzU29lMWtiU1VaRGt1QlZ3V1hCSklfbE5HMGZzcDFVaFNTcndjdTdRQUl3QSIsImlkIjoiZmNfMSJ9\"\n }\n ],\n \"answer_box\": {\n \"type\": \"organic_result\",\n \"title\": \"United States\/President\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=Joe+Biden&stick=H4sIAAAAAAAAAONgVuLUz9U3MDRKrzB6xGjCLfDyxz1hKe1Ja05eY1Tl4grOyC93zSvJLKkUEudig7J4pbi5ELp4FrFyeuWnKjhlpqTmAQDFEJYBUAAAAA&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQzIcDKAB6BAg2EAE\",\n \"answer\": \"Joe Biden\",\n \"thumbnail\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/fea807698ab0aaf98cc81ed2a4d632003eaccf0b0c92b22d.jpeg\",\n \"people_also_search_for\": [\n {\n \"name\": \"Donald Trump\",\n \"image\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/fea807698ab0aaf9540daf91300be90e2ac8c9a7730921f8ffd3c5af42a14c56ef55e461bde4fbc2daacf7c51f9cf404.jpeg\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=Donald+Trump&stick=H4sIAAAAAAAAAONgFuLUz9U3sEw2LzdQAjOTC0ssDbT4AlKLivPzgjNTUssTK4sXsfK45Ocl5qQohBSV5hYAAPh9gPk3AAAA&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQxA16BAgzEAQ\"\n },\n {\n \"name\": \"Melania Trump\",\n \"image\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/fea807698ab0aaf9540daf91300be90e2ac8c9a7730921f8ffd3c5af42a14c56e2f1dbe7249ecefc882f9968ee8d4f83.jpeg\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=Melania+Trump&stick=H4sIAAAAAAAAAONgFuLUz9U3sEw2LzdQAjNNMtLyyrT4AlKLivPzgjNTUssTK4sXsfL6puYk5mUmKoQUleYWAAA_LcJBOAAAAA&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQxA16BAgzEAY\"\n },\n {\n \"name\": \"Kamala Harris\",\n \"image\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/fea807698ab0aaf9540daf91300be90e2ac8c9a7730921f8ffd3c5af42a14c56cd3bc7dcbb3bd12cfa70b1d5084adee6.png\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=Kamala+Harris&stick=H4sIAAAAAAAAAONgFuLUz9U3sEw2LzdQAjMtiosqjbT4AlKLivPzgjNTUssTK4sXsfJ6J-Ym5iQqeCQWFWUWAwBayCUZOAAAAA&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQxA16BAgzEAg\"\n },\n {\n \"name\": \"Pete Buttigieg\",\n \"image\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/fea807698ab0aaf9540daf91300be90e2ac8c9a7730921f8ffd3c5af42a14c565fa964a151e814f71bb6ce3e112e9262.jpeg\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=Pete+Buttigieg&stick=H4sIAAAAAAAAAONgFuLUz9U3sEw2LzdQ4gIxMzIK043NtfgCUouK8_OCM1NSyxMrixexAgVKUhWcSktKMtMzU9MBaxYWRToAAAA&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQxA16BAgzEAo\"\n },\n {\n \"name\": \"Jill Biden\",\n \"image\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/fea807698ab0aaf9540daf91300be90e2ac8c9a7730921f8ffd3c5af42a14c569caed0675e403023bfdaf6b2f55d6c60.jpeg\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=Jill+Biden&stick=H4sIAAAAAAAAAONgFuLUz9U3sEw2LzdQ4gIxTbJSLMwztPgCUouK8_OCM1NSyxMrixexcnll5uQoOAH5eQBKFOGZNgAAAA&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQxA16BAgzEAw\"\n },\n {\n \"name\": \"Barack Obama\",\n \"image\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/fea807698ab0aaf9540daf91300be90e2ac8c9a7730921f8ffd3c5af42a14c56030aeb97d1b390967bb8364b883c467d.jpeg\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=Barack+Obama&stick=H4sIAAAAAAAAAONgFuLUz9U3sEw2LzdQAjONcrNyi7T4AlKLivPzgjNTUssTK4sXsfI4JRYlJmcr-Ccl5iYCANsrw7U3AAAA&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQxA16BAgzEA4\"\n },\n {\n \"name\": \"Neilia Hunter Biden\",\n \"image\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/fea807698ab0aaf9540daf91300be90e2ac8c9a7730921f8ffd3c5af42a14c564a60ca9f61937e99a2b1eeeb72eeceb2.jpeg\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=Neilia+Hunter&stick=H4sIAAAAAAAAAONgFuLUz9U3sEw2LzdQ4gIxTTKqynMNtfgCUouK8_OCM1NSyxMrixex8vqlZuZkJip4lOaVpBYBAAOdVWM5AAAA&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQxA16BAgzEBA\"\n }\n ]\n },\n \"organic_results\": [\n {\n \"position\": 1,\n \"title\": \"Joe Biden: The President\",\n \"link\": \"https:\/\/www.whitehouse.gov\/administration\/president-biden\/\",\n \"redirect_link\": \"https:\/\/www.google.com\/url?sa=t&source=web&rct=j&opi=89978449&url=https:\/\/www.whitehouse.gov\/administration\/president-biden\/&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQFnoECBcQAQ\",\n \"displayed_link\": \"https:\/\/www.whitehouse.gov \u203a administration \u203a presiden...\",\n \"thumbnail\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/0bfbecbf14e47c61b3258776da1d809123675ce52671276e6ec6771c150bee72.jpeg\",\n \"favicon\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/0bfbecbf14e47c61b3258776da1d80910f9b173b72e9eab1601615c1605938de.png\",\n \"snippet\": \"President Biden represented Delaware for 36 years in the US Senate before becoming the 47th Vice President of the United States.\",\n \"snippet_highlighted_words\": [\n \"President\",\n \"President of the United States\"\n ],\n \"source\": \"The White House (.gov)\"\n },\n {\n \"position\": 2,\n \"title\": \"President of the United States\",\n \"link\": \"https:\/\/en.wikipedia.org\/wiki\/President_of_the_United_States\",\n \"redirect_link\": \"https:\/\/www.google.com\/url?sa=t&source=web&rct=j&opi=89978449&url=https:\/\/en.wikipedia.org\/wiki\/President_of_the_United_States&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQFnoECE0QAQ\",\n \"displayed_link\": \"https:\/\/en.wikipedia.org \u203a wiki \u203a President_of_the_Unit...\",\n \"thumbnail\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/0bfbecbf14e47c61b3258776da1d8091fc3a8227d2a2bfb02dc42ab2d1dbfcbe.jpeg\",\n \"favicon\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/0bfbecbf14e47c61b3258776da1d809158e8117e92dd1333a25421ce047e75a9.png\",\n \"snippet\": \"The president of the United States (POTUS) is the head of state and head of government of the United States of America. The president directs the executive ...\",\n \"snippet_highlighted_words\": [\n \"president of the United States\",\n \"United States\",\n \"president\"\n ],\n \"sitelinks\": {\n \"inline\": [\n {\n \"title\": \"List\",\n \"link\": \"https:\/\/en.wikipedia.org\/wiki\/List_of_presidents_of_the_United_States\"\n },\n {\n \"title\": \"Powers of the president\",\n \"link\": \"https:\/\/en.wikipedia.org\/wiki\/Powers_of_the_president_of_the_United_States\"\n },\n {\n \"title\": \"Executive Office\",\n \"link\": \"https:\/\/en.wikipedia.org\/wiki\/Executive_Office_of_the_President_of_the_United_States\"\n },\n {\n \"title\": \"Seal of the president\",\n \"link\": \"https:\/\/en.wikipedia.org\/wiki\/Seal_of_the_president_of_the_United_States\"\n }\n ]\n },\n \"source\": \"Wikipedia\"\n },\n {\n \"position\": 3,\n \"title\": \"President of the United States\",\n \"link\": \"https:\/\/usun.usmission.gov\/our-leaders\/the-president-of-the-united-states\/\",\n \"redirect_link\": \"https:\/\/www.google.com\/url?sa=t&source=web&rct=j&opi=89978449&url=https:\/\/usun.usmission.gov\/our-leaders\/the-president-of-the-united-states\/&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQFnoECEsQAQ\",\n \"displayed_link\": \"https:\/\/usun.usmission.gov \u203a Our Leaders\",\n \"favicon\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/0bfbecbf14e47c61b3258776da1d8091121c5487a8779ef9f7acea7b19505bc8.png\",\n \"snippet\": \"President Biden represented Delaware for 36 years in the US Senate before becoming the 47th Vice President of the United States.\",\n \"snippet_highlighted_words\": [\n \"President\",\n \"President of the United States\"\n ],\n \"source\": \"United States Mission to the United Nations (.gov)\"\n },\n {\n \"position\": 4,\n \"title\": \"President Joe Biden (@potus)\",\n \"link\": \"https:\/\/www.instagram.com\/potus\/?hl=en\",\n \"redirect_link\": \"https:\/\/www.google.com\/url?sa=t&source=web&rct=j&opi=89978449&url=https:\/\/www.instagram.com\/potus\/%3Fhl%3Den&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQFnoECEoQAQ\",\n \"displayed_link\": \"19.1M+ followers\",\n \"favicon\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/0bfbecbf14e47c61b3258776da1d8091ad45f5dadf4a42654be2bc1d744225aa.png\",\n \"snippet\": \"19M Followers, 5 Following, 4403 Posts - President Joe Biden (@potus) on Instagram: \\\"46th President of the United States, husband to @flotus, proud dad and ...\",\n \"snippet_highlighted_words\": [\n \"President\",\n \"President of the United States\"\n ],\n \"source\": \"Instagram \u00b7 potus\"\n },\n {\n \"position\": 5,\n \"title\": \"Presidents, vice presidents, and first ladies\",\n \"link\": \"https:\/\/www.usa.gov\/presidents\",\n \"redirect_link\": \"https:\/\/www.google.com\/url?sa=t&source=web&rct=j&opi=89978449&url=https:\/\/www.usa.gov\/presidents&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQFnoECFwQAQ\",\n \"displayed_link\": \"https:\/\/www.usa.gov \u203a ... \u203a U.S. facts and figures\",\n \"favicon\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/0bfbecbf14e47c61b3258776da1d80918c36147c96afe6855fcd63f1ec9e9f13.png\",\n \"snippet\": \"Learn about the duties of president, vice president, and first lady of the United States. Find out how to contact and learn more about current and past leaders.\",\n \"snippet_highlighted_words\": [\n \"president\",\n \"president\",\n \"United States\",\n \"current\"\n ],\n \"source\": \"USA.gov\"\n },\n {\n \"position\": 6,\n \"title\": \"The Executive Branch\",\n \"link\": \"https:\/\/www.whitehouse.gov\/about-the-white-house\/our-government\/the-executive-branch\/\",\n \"redirect_link\": \"https:\/\/www.google.com\/url?sa=t&source=web&rct=j&opi=89978449&url=https:\/\/www.whitehouse.gov\/about-the-white-house\/our-government\/the-executive-branch\/&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQFnoECEkQAQ\",\n \"displayed_link\": \"https:\/\/www.whitehouse.gov \u203a ... \u203a Our Government\",\n \"favicon\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/0bfbecbf14e47c61b3258776da1d8091d2def812f73ab4a461c4ccb1a6f18154.png\",\n \"snippet\": \"From the President, to the Vice President, to the Cabinet, learn more about the Executive Branch of the government of the United States.\",\n \"snippet_highlighted_words\": [\n \"President\",\n \"President\",\n \"United States\"\n ],\n \"source\": \"The White House (.gov)\"\n },\n {\n \"position\": 7,\n \"title\": \"President Joe Biden\",\n \"link\": \"https:\/\/www.facebook.com\/POTUS\/\",\n \"redirect_link\": \"https:\/\/www.google.com\/url?sa=t&source=web&rct=j&opi=89978449&url=https:\/\/www.facebook.com\/POTUS\/&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQFnoECEwQAQ\",\n \"displayed_link\": \"12M+ followers\",\n \"favicon\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/0bfbecbf14e47c61b3258776da1d8091707d8df4bff108102635656d2baac128.png\",\n \"snippet\": \"President Joe Biden. 10334178 likes \u00b7 175010 talking about this. 46th President of the United States, husband to @FLOTUS, proud father and pop. Text...\",\n \"snippet_highlighted_words\": [\n \"President\",\n \"President of the United States\"\n ],\n \"source\": \"Facebook \u00b7 President Joe Biden\"\n },\n {\n \"position\": 8,\n \"title\": \"Joe Biden\",\n \"link\": \"https:\/\/en.wikipedia.org\/wiki\/Joe_Biden\",\n \"redirect_link\": \"https:\/\/www.google.com\/url?sa=t&source=web&rct=j&opi=89978449&url=https:\/\/en.wikipedia.org\/wiki\/Joe_Biden&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQFnoECEYQAQ\",\n \"displayed_link\": \"https:\/\/en.wikipedia.org \u203a wiki \u203a Joe_Biden\",\n \"favicon\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/0bfbecbf14e47c61b3258776da1d809144cacfc2f26d14a73b65e5227ec342ec.png\",\n \"snippet\": \"Joseph Robinette Biden Jr. (born November 20, 1942) is an American politician who has been the 46th and current president of the United States since 2021.\",\n \"snippet_highlighted_words\": [\n \"current president of the United States\"\n ],\n \"sitelinks\": {\n \"inline\": [\n {\n \"title\": \"Political positions\",\n \"link\": \"https:\/\/en.wikipedia.org\/wiki\/Political_positions_of_Joe_Biden\"\n },\n {\n \"title\": \"Electoral history\",\n \"link\": \"https:\/\/en.wikipedia.org\/wiki\/Electoral_history_of_Joe_Biden\"\n },\n {\n \"title\": \"2008 Presidential Campaign\",\n \"link\": \"https:\/\/en.wikipedia.org\/wiki\/Joe_Biden_2008_presidential_campaign\"\n },\n {\n \"title\": \"Class president\",\n \"link\": \"https:\/\/en.wikipedia.org\/wiki\/Class_president\"\n }\n ]\n },\n \"source\": \"Wikipedia\"\n },\n {\n \"position\": 9,\n \"title\": \"Joe Biden's Path to the United States Presidency\",\n \"link\": \"https:\/\/www.britannica.com\/video\/226766\/who-is-President-Joe-Biden\",\n \"displayed_link\": \"https:\/\/www.britannica.com \u203a who-is-President-Joe-Biden\",\n \"thumbnail\": \"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcTBA5esZeOMzKNwtbAdAAGDKnIzwZu8OaAUEdHwYIqlx8lK&s\",\n \"favicon\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/0bfbecbf14e47c61b3258776da1d8091086f5f0710fc4ac6a767cc31b14513b3.png\",\n \"date\": \"Dec 22, 2010\",\n \"snippet\": \"Joe Biden is an American politician and the 46th president of the United States. He previously served as vice president under President Barack Obama.\",\n \"duration\": \"2:21\",\n \"rich_snippet\": {\n \"top\": {\n \"extensions\": [\n \"Britannica\",\n \"Dec 22, 2010\"\n ],\n \"detected_extensions\": {\n \"dec\": 22\n }\n }\n },\n \"video_link\": \"https:\/\/encrypted-vtbn0.gstatic.com\/video?q=tbn:ANd9GcROuAdejw5zIuel829Yg2a-WcElSEWdOPVjSg\",\n \"source\": \"Britannica\"\n },\n {\n \"position\": 10,\n \"title\": \"President of the United States\",\n \"link\": \"https:\/\/ballotpedia.org\/President_of_the_United_States\",\n \"redirect_link\": \"https:\/\/www.google.com\/url?sa=t&source=web&rct=j&opi=89978449&url=https:\/\/ballotpedia.org\/President_of_the_United_States&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQFnoECEcQAQ\",\n \"displayed_link\": \"https:\/\/ballotpedia.org \u203a President_of_the_United_States\",\n \"favicon\": \"https:\/\/serpapi.com\/searches\/66ffec51a47167fa26c5db81\/images\/0bfbecbf14e47c61b3258776da1d80916b88fa1cdd7b20092d43d06af230b264.png\",\n \"snippet\": \"Article II of the U.S. Constitution laid out the requirements and roles of the president. The current president is Joe Biden (D). Election requirements.\",\n \"snippet_highlighted_words\": [\n \"U.S.\",\n \"president\",\n \"current president\"\n ],\n \"source\": \"Ballotpedia\"\n }\n ],\n \"related_searches\": [\n {\n \"block_position\": 1,\n \"query\": \"Who is the Vice President of the United States\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=Who+is+the+Vice+President+of+the+United+States&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQ1QJ6BAhsEAE\",\n \"serpapi_link\": \"https:\/\/serpapi.com\/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=Who+is+the+Vice+President+of+the+United+States\"\n },\n {\n \"block_position\": 1,\n \"query\": \"Who is the 46th president\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=Who+is+the+46th+president&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQ1QJ6BAhrEAE\",\n \"serpapi_link\": \"https:\/\/serpapi.com\/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=Who+is+the+46th+president\"\n },\n {\n \"block_position\": 1,\n \"query\": \"All Presidents in order\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=All+Presidents+in+order&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQ1QJ6BAhqEAE\",\n \"serpapi_link\": \"https:\/\/serpapi.com\/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=All+Presidents+in+order\"\n },\n {\n \"block_position\": 1,\n \"query\": \"48th president of the United States\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=48th+president+of+the+United+States&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQ1QJ6BAhnEAE\",\n \"serpapi_link\": \"https:\/\/serpapi.com\/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=48th+president+of+the+United+States\"\n },\n {\n \"block_position\": 1,\n \"query\": \"Who is the New president of the United States\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=Who+is+the+New+president+of+the+United+States&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQ1QJ6BAhoEAE\",\n \"serpapi_link\": \"https:\/\/serpapi.com\/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=Who+is+the+New+president+of+the+United+States\"\n },\n {\n \"block_position\": 1,\n \"query\": \"Joe Biden age\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=Joe+Biden+age&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQ1QJ6BAhpEAE\",\n \"serpapi_link\": \"https:\/\/serpapi.com\/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=Joe+Biden+age\"\n },\n {\n \"block_position\": 1,\n \"query\": \"47th President of the United States\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=47th+President+of+the+United+States&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQ1QJ6BAhmEAE\",\n \"serpapi_link\": \"https:\/\/serpapi.com\/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=47th+President+of+the+United+States\"\n },\n {\n \"block_position\": 1,\n \"query\": \"First president of USA\",\n \"link\": \"https:\/\/www.google.com\/search?sca_esv=36a5aede6ef96498&q=First+president+of+USA&sa=X&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQ1QJ6BAhlEAE\",\n \"serpapi_link\": \"https:\/\/serpapi.com\/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=First+president+of+USA\"\n }\n ],\n \"pagination\": {\n \"current\": 1,\n \"next\": \"https:\/\/www.google.com\/search?q=current+president+of+the+United+States&sca_esv=36a5aede6ef96498&ei=U-z_Zv36FbeYwbkPtJfriA8&start=10&sa=N&sstk=Aagrsuh2J88a0tO64r05qPt1czsFtLr9Gs-uZvWWlcNuJR1tUIWWrRk8sGPFipniZSWuihkhGvULTiNLp6j6Oj0L367Oks-NBYyaxg&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQ8NMDegQIYhAW\",\n \"other_pages\": {\n \"2\": \"https:\/\/www.google.com\/search?q=current+president+of+the+United+States&sca_esv=36a5aede6ef96498&ei=U-z_Zv36FbeYwbkPtJfriA8&start=10&sa=N&sstk=Aagrsuh2J88a0tO64r05qPt1czsFtLr9Gs-uZvWWlcNuJR1tUIWWrRk8sGPFipniZSWuihkhGvULTiNLp6j6Oj0L367Oks-NBYyaxg&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQ8tMDegQIYhAE\",\n \"3\": \"https:\/\/www.google.com\/search?q=current+president+of+the+United+States&sca_esv=36a5aede6ef96498&ei=U-z_Zv36FbeYwbkPtJfriA8&start=20&sa=N&sstk=Aagrsuh2J88a0tO64r05qPt1czsFtLr9Gs-uZvWWlcNuJR1tUIWWrRk8sGPFipniZSWuihkhGvULTiNLp6j6Oj0L367Oks-NBYyaxg&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQ8tMDegQIYhAG\",\n \"4\": \"https:\/\/www.google.com\/search?q=current+president+of+the+United+States&sca_esv=36a5aede6ef96498&ei=U-z_Zv36FbeYwbkPtJfriA8&start=30&sa=N&sstk=Aagrsuh2J88a0tO64r05qPt1czsFtLr9Gs-uZvWWlcNuJR1tUIWWrRk8sGPFipniZSWuihkhGvULTiNLp6j6Oj0L367Oks-NBYyaxg&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQ8tMDegQIYhAI\",\n \"5\": \"https:\/\/www.google.com\/search?q=current+president+of+the+United+States&sca_esv=36a5aede6ef96498&ei=U-z_Zv36FbeYwbkPtJfriA8&start=40&sa=N&sstk=Aagrsuh2J88a0tO64r05qPt1czsFtLr9Gs-uZvWWlcNuJR1tUIWWrRk8sGPFipniZSWuihkhGvULTiNLp6j6Oj0L367Oks-NBYyaxg&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQ8tMDegQIYhAK\",\n \"6\": \"https:\/\/www.google.com\/search?q=current+president+of+the+United+States&sca_esv=36a5aede6ef96498&ei=U-z_Zv36FbeYwbkPtJfriA8&start=50&sa=N&sstk=Aagrsuh2J88a0tO64r05qPt1czsFtLr9Gs-uZvWWlcNuJR1tUIWWrRk8sGPFipniZSWuihkhGvULTiNLp6j6Oj0L367Oks-NBYyaxg&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQ8tMDegQIYhAM\",\n \"7\": \"https:\/\/www.google.com\/search?q=current+president+of+the+United+States&sca_esv=36a5aede6ef96498&ei=U-z_Zv36FbeYwbkPtJfriA8&start=60&sa=N&sstk=Aagrsuh2J88a0tO64r05qPt1czsFtLr9Gs-uZvWWlcNuJR1tUIWWrRk8sGPFipniZSWuihkhGvULTiNLp6j6Oj0L367Oks-NBYyaxg&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQ8tMDegQIYhAO\",\n \"8\": \"https:\/\/www.google.com\/search?q=current+president+of+the+United+States&sca_esv=36a5aede6ef96498&ei=U-z_Zv36FbeYwbkPtJfriA8&start=70&sa=N&sstk=Aagrsuh2J88a0tO64r05qPt1czsFtLr9Gs-uZvWWlcNuJR1tUIWWrRk8sGPFipniZSWuihkhGvULTiNLp6j6Oj0L367Oks-NBYyaxg&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQ8tMDegQIYhAQ\",\n \"9\": \"https:\/\/www.google.com\/search?q=current+president+of+the+United+States&sca_esv=36a5aede6ef96498&ei=U-z_Zv36FbeYwbkPtJfriA8&start=80&sa=N&sstk=Aagrsuh2J88a0tO64r05qPt1czsFtLr9Gs-uZvWWlcNuJR1tUIWWrRk8sGPFipniZSWuihkhGvULTiNLp6j6Oj0L367Oks-NBYyaxg&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQ8tMDegQIYhAS\",\n \"10\": \"https:\/\/www.google.com\/search?q=current+president+of+the+United+States&sca_esv=36a5aede6ef96498&ei=U-z_Zv36FbeYwbkPtJfriA8&start=90&sa=N&sstk=Aagrsuh2J88a0tO64r05qPt1czsFtLr9Gs-uZvWWlcNuJR1tUIWWrRk8sGPFipniZSWuihkhGvULTiNLp6j6Oj0L367Oks-NBYyaxg&ved=2ahUKEwi98Kue6fSIAxU3TDABHbTLGvEQ8tMDegQIYhAU\"\n }\n },\n \"serpapi_pagination\": {\n \"current\": 1,\n \"next_link\": \"https:\/\/serpapi.com\/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=current+president+of+the+United+States&start=10\",\n \"next\": \"https:\/\/serpapi.com\/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=current+president+of+the+United+States&start=10\",\n \"other_pages\": {\n \"2\": \"https:\/\/serpapi.com\/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=current+president+of+the+United+States&start=10\",\n \"3\": \"https:\/\/serpapi.com\/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=current+president+of+the+United+States&start=20\",\n \"4\": \"https:\/\/serpapi.com\/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=current+president+of+the+United+States&start=30\",\n \"5\": \"https:\/\/serpapi.com\/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=current+president+of+the+United+States&start=40\",\n \"6\": \"https:\/\/serpapi.com\/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=current+president+of+the+United+States&start=50\",\n \"7\": \"https:\/\/serpapi.com\/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=current+president+of+the+United+States&start=60\",\n \"8\": \"https:\/\/serpapi.com\/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=current+president+of+the+United+States&start=70\",\n \"9\": \"https:\/\/serpapi.com\/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=current+president+of+the+United+States&start=80\",\n \"10\": \"https:\/\/serpapi.com\/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=current+president+of+the+United+States&start=90\"\n }\n }\n}" -} diff --git a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-aabcdc9cde285aa6d7d0dd01b03c7b1c.json b/tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-aabcdc9cde285aa6d7d0dd01b03c7b1c.json deleted file mode 100644 index 6c306bc..0000000 --- a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-aabcdc9cde285aa6d7d0dd01b03c7b1c.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:29:54 GMT", - "Content-Type": "application\/json", - "Content-Length": "676", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "1058", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999050", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "28ms", - "x-request-id": "req_3b949168b3ca9daf7d5be223bbca1ed3", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=pjfhIhJbAaIG04755EbB7LYEG.zHp1ks5afhD0.f74c-1729560594-1.0.1.1-bmGL3vVBgNNovCC66JF0RsHbPpgKHqWVYWyGHk1EfVE1vLnsEkHdbQyS1R_DZchiR2UYvhTBP865k3ovMjJjlg; path=\/; expires=Tue, 22-Oct-24 01:59:54 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=xu0leeGwltYjfV9AQ3O7JAmRR1mxyAgSkFbbH1_SMjI-1729560594932-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b80ee97942cb-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKy0XglWk28KEm56nQ5s8EkonCm9N\",\n \"object\": \"chat.completion\",\n \"created\": 1729560593,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Joe Biden\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1025,\n \"completion_tokens\": 15,\n \"total_tokens\": 1040,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Tools/Serper-Tool.json b/tests/Fixtures/Saloon/Tools/Serper-Tool.json index 4cd1e0d..e0431e8 100644 --- a/tests/Fixtures/Saloon/Tools/Serper-Tool.json +++ b/tests/Fixtures/Saloon/Tools/Serper-Tool.json @@ -1,10 +1,10 @@ { - "statusCode": 200, - "headers": { - "access-control-allow-origin": "*", - "x-ratelimit-limit": "500", - "x-ratelimit-remaining": "499", - "x-ratelimit-reset": "1728047535" - }, - "data": "{\"searchParameters\":{\"q\":\"current president of the United States\",\"type\":\"search\",\"num\":1,\"engine\":\"google\"},\"answerBox\":{\"title\":\"United States / President\",\"answer\":\"Joe Biden\"},\"organic\":[{\"title\":\"Joe Biden: The President | The White House\",\"link\":\"https://www.whitehouse.gov/administration/president-biden/\",\"snippet\":\"President Biden represented Delaware for 36 years in the US Senate before becoming the 47th Vice President of the United States.\",\"position\":1}],\"relatedSearches\":[{\"query\":\"Who is the Vice President of the United States\"},{\"query\":\"Who is the 46th president\"},{\"query\":\"All Presidents in order\"},{\"query\":\"48th president of the United States\"},{\"query\":\"Who is the New president of the United States\"},{\"query\":\"Joe Biden age\"},{\"query\":\"47th President of the United States\"},{\"query\":\"First president of USA\"}],\"credits\":1}" + "statusCode": 200, + "headers": { + "access-control-allow-origin": "*", + "x-ratelimit-limit": "500", + "x-ratelimit-remaining": "499", + "x-ratelimit-reset": "1729901585" + }, + "data": "{\"searchParameters\":{\"q\":\"current president of the United States\",\"type\":\"search\",\"num\":10,\"engine\":\"google\"},\"answerBox\":{\"title\":\"United States \/ President\",\"answer\":\"Joe Biden\"},\"organic\":[{\"title\":\"Joe Biden: The President | The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/administration\/president-biden\/\",\"snippet\":\"President Biden represented Delaware for 36 years in the US Senate before becoming the 47th Vice President of the United States.\",\"position\":1},{\"title\":\"President of the United States - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/President_of_the_United_States\",\"snippet\":\"The president of the United States (POTUS) is the head of state and head of government of the United States of America. The president directs the executive ...\",\"sitelinks\":[{\"title\":\"American Presidents\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/List_of_presidents_of_the_United_States\"},{\"title\":\"Powers of the president\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Powers_of_the_president_of_the_United_States\"},{\"title\":\"Executive Office\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Executive_Office_of_the_President_of_the_United_States\"},{\"title\":\"Talk\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/President_of_the_United_States_(disambiguation)\"}],\"position\":2},{\"title\":\"President of the United States\",\"link\":\"https:\/\/usun.usmission.gov\/our-leaders\/the-president-of-the-united-states\/\",\"snippet\":\"President Biden represented Delaware for 36 years in the US Senate before becoming the 47th Vice President of the United States.\",\"position\":3},{\"title\":\"The Executive Branch | The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/about-the-white-house\/our-government\/the-executive-branch\/\",\"snippet\":\"From the President, to the Vice President, to the Cabinet, learn more about the Executive Branch of the government of the United States.\",\"position\":4},{\"title\":\"President Joe Biden (@potus) \u2022 Instagram photos and videos\",\"link\":\"https:\/\/www.instagram.com\/potus\/?hl=en\",\"snippet\":\"19M Followers, 5 Following, 4491 Posts - President Joe Biden (@potus) on Instagram: \\\"46th President of the United States, husband to @flotus ...\",\"date\":\"2 days ago\",\"position\":5},{\"title\":\"Presidents, vice presidents, and first ladies | USAGov\",\"link\":\"https:\/\/www.usa.gov\/presidents\",\"snippet\":\"Learn about the duties of the U.S. president, vice president, and first lady. Find out how to contact and learn more about current and past ...\",\"date\":\"Sep 20, 2024\",\"position\":6},{\"title\":\"Joe Biden - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Joe_Biden\",\"snippet\":\"Joseph Robinette Biden Jr. (born November 20, 1942) is an American politician who has been the 46th and current president of the United States since 2021.\",\"position\":7},{\"title\":\"Joe Biden's Path to the United States Presidency | Britannica\",\"link\":\"https:\/\/www.britannica.com\/video\/who-is-President-Joe-Biden\/-261012\",\"snippet\":\"Learn more about the life and career of Joe Biden, the 46th president of the United States.\",\"date\":\"Jan 7, 2022\",\"attributes\":{\"Duration\":\"2:21\",\"Posted\":\"Jan 7, 2022\"},\"position\":8},{\"title\":\"Presidents of the United States of America - Ohio Secretary of State\",\"link\":\"https:\/\/www.ohiosos.gov\/elections\/election-results-and-data\/historical-election-comparisons\/presidents-of-the-united-states-of-america\/\",\"snippet\":\"4,5 \u00b7 6,7 \u00b7 8,9 \u00b7 10 ; Thomas Jefferson \u00b7 James Madison \u00b7 James Monroe \u00b7 John Quincy Adams.\",\"position\":9},{\"title\":\"Joe Biden | Biography, Family, Policies, & Facts | Britannica\",\"link\":\"https:\/\/www.britannica.com\/biography\/Joe-Biden\",\"snippet\":\"Joe Biden, the 46th president of the United States, brings decades of political experience and a commitment to unity as he leads America ...\",\"date\":\"Oct 7, 2024\",\"position\":10}],\"peopleAlsoAsk\":[{\"question\":\"Who is the new president of the United States?\",\"snippet\":\"As President, Biden will restore America's leadership and build our communities back better.\",\"title\":\"Joe Biden: The President | The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/administration\/president-biden\/\"},{\"question\":\"Who was the youngest president of the USA?\",\"snippet\":\"The median age at inauguration of incoming U.S. presidents is 55 years. The youngest person to become U.S. president was Theodore Roosevelt, who, at age 42, succeeded to the office after the assassination of William McKinley.\",\"title\":\"List of presidents of the United States by age - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/List_of_presidents_of_the_United_States_by_age\"},{\"question\":\"Who is number 1 president?\",\"snippet\":\"Abraham Lincoln has taken the highest ranking in each survey and George Washington, Franklin D. Roosevelt, and Theodore Roosevelt have always ranked in the top five while James Buchanan, Andrew Johnson, and Franklin Pierce have been ranked at the bottom of all four surveys.\",\"title\":\"Historical rankings of presidents of the United States - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Historical_rankings_of_presidents_of_the_United_States\"},{\"question\":\"Who was the 47th vice president?\",\"snippet\":\"Joseph Robinette Biden, Jr., represented Delaware for 36 years in the U.S. Senate before becoming the 47th and current Vice President of the United States.\",\"title\":\"Vice President Joe Biden | The White House\",\"link\":\"https:\/\/obamawhitehouse.archives.gov\/vp\"}],\"relatedSearches\":[{\"query\":\"Who is the Vice President of the United States\"},{\"query\":\"Who is the 46th president\"},{\"query\":\"47th President of the United States\"},{\"query\":\"All Presidents in order\"},{\"query\":\"48th President of the United States\"},{\"query\":\"Who is the New President of the United States\"},{\"query\":\"Joe Biden age\"},{\"query\":\"Is Joe Biden still president\"}],\"credits\":1}" } diff --git a/tests/Fixtures/Saloon/Tools/SerperTestAgent-28125624c9418e220ffb104b593f9f20.json b/tests/Fixtures/Saloon/Tools/SerperTestAgent-28125624c9418e220ffb104b593f9f20.json deleted file mode 100644 index 3066f10..0000000 --- a/tests/Fixtures/Saloon/Tools/SerperTestAgent-28125624c9418e220ffb104b593f9f20.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:29:57 GMT", - "Content-Type": "application/json", - "Content-Length": "674", - "Connection": "keep-alive", - "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "778", - "openai-version": "2020-10-01", - "x-ratelimit-limit-requests": "10000", - "x-ratelimit-limit-tokens": "2000000", - "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "1999797", - "x-ratelimit-reset-requests": "6ms", - "x-ratelimit-reset-tokens": "6ms", - "x-request-id": "req_c2fbd9881a6b7a89292c13096028f737", - "strict-transport-security": "max-age=31536000; includeSubDomains; preload", - "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=C8t5g1M5x7bFzEEBfs.NC7QOFXARyEMQvJCpyPj0Xx0-1729560597-1.0.1.1-eydqKVILd1gSGoLl4FZrT6O6_kr_0HO2irYagsTgHcIm7qKPqG3iz6vMPbF1mvpBAosC6aPes4m2tie.KTmfHA; path=/; expires=Tue, 22-Oct-24 01:59:57 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=065oGLFxrDEEEQV3jpIU.UvhjSb9EFeKQR8oUWBrigo-1729560597771-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], - "X-Content-Type-Options": "nosniff", - "Server": "cloudflare", - "CF-RAY": "8d65b822684d7c7b-EWR", - "alt-svc": "h3=\":443\"; ma=86400" - }, - "data": "{\n \"id\": \"chatcmpl-AKy0b2tUDQZmexXwAz4pWig0YDGwk\",\n \"object\": \"chat.completion\",\n \"created\": 1729560597,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Joe Biden\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 300,\n \"completion_tokens\": 15,\n \"total_tokens\": 315,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/SerperTestAgent-39474d616ece521a51e916ab18d5ff87.json b/tests/Fixtures/Saloon/Tools/SerperTestAgent-39474d616ece521a51e916ab18d5ff87.json deleted file mode 100644 index 787a17e..0000000 --- a/tests/Fixtures/Saloon/Tools/SerperTestAgent-39474d616ece521a51e916ab18d5ff87.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Fri, 04 Oct 2024 13:12:15 GMT", - "Content-Type": "application\/json", - "Transfer-Encoding": "chunked" - }, - "data": "{\n \"id\": \"chatcmpl-AEcOMVg1N9uoRppCSIPzWPx7Jrkxs\",\n \"object\": \"chat.completion\",\n \"created\": 1728047534,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Joe Biden\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 275,\n \"completion_tokens\": 15,\n \"total_tokens\": 290,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_82bed303cf\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/SerperTestAgent-4d9c37b83db9353afd0462b60417eb0e.json b/tests/Fixtures/Saloon/Tools/SerperTestAgent-4d9c37b83db9353afd0462b60417eb0e.json deleted file mode 100644 index 72205ad..0000000 --- a/tests/Fixtures/Saloon/Tools/SerperTestAgent-4d9c37b83db9353afd0462b60417eb0e.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Fri, 04 Oct 2024 13:12:13 GMT", - "Content-Type": "application\/json", - "Transfer-Encoding": "chunked" - }, - "data": "{\n \"id\": \"chatcmpl-AEcOKAKZHbsrzjN8HMJa1Bg5uowvI\",\n \"object\": \"chat.completion\",\n \"created\": 1728047532,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_BpDI13OeaoahqPG9X6iaDpdK\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"serper_tool\",\n \"arguments\": \"{\\\"query\\\":\\\"current president of the United States\\\",\\\"searchType\\\":\\\"search\\\",\\\"numberOfResults\\\":1}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 178,\n \"completion_tokens\": 30,\n \"total_tokens\": 208,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_82bed303cf\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Tools/SerperTestAgent-8c4de06e2a7064e26c30dd1131e7c149.json b/tests/Fixtures/Saloon/Tools/SerperTestAgent-8c4de06e2a7064e26c30dd1131e7c149.json index 1ea31bb..99cff12 100644 --- a/tests/Fixtures/Saloon/Tools/SerperTestAgent-8c4de06e2a7064e26c30dd1131e7c149.json +++ b/tests/Fixtures/Saloon/Tools/SerperTestAgent-8c4de06e2a7064e26c30dd1131e7c149.json @@ -1,13 +1,13 @@ { "statusCode": 200, "headers": { - "Date": "Tue, 22 Oct 2024 01:29:56 GMT", + "Date": "Sat, 26 Oct 2024 00:13:02 GMT", "Content-Type": "application\/json", "Content-Length": "936", "Connection": "keep-alive", "access-control-expose-headers": "X-Request-ID", - "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", - "openai-processing-ms": "890", + "openai-organization": "REDACTED", + "openai-processing-ms": "777", "openai-version": "2020-10-01", "x-ratelimit-limit-requests": "10000", "x-ratelimit-limit-tokens": "2000000", @@ -15,17 +15,13 @@ "x-ratelimit-remaining-tokens": "1999865", "x-ratelimit-reset-requests": "6ms", "x-ratelimit-reset-tokens": "4ms", - "x-request-id": "req_3007c8cf06d1eca2fecb7a9fb57981bc", + "x-request-id": "REDACTED", "strict-transport-security": "max-age=31536000; includeSubDomains; preload", "CF-Cache-Status": "DYNAMIC", - "Set-Cookie": [ - "__cf_bm=8vuVetc9u88WEaMoNWWZaW0uISiIzo2iQCc8yY0araM-1729560596-1.0.1.1-Z_9eHUEoXhdB2m1FI7PHPX7enFnLT7Hdhr6dtLBa05TXrFfDHTKeGas016VlTL25kB0U_56ZBkT5edOGDNzOOQ; path=\/; expires=Tue, 22-Oct-24 01:59:56 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", - "_cfuvid=BLsiiu1QW3zLXgej2d3jvgSGnTtmRHgdGC0ItWq9lOo-1729560596646-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" - ], "X-Content-Type-Options": "nosniff", "Server": "cloudflare", - "CF-RAY": "8d65b81abda64376-EWR", + "CF-RAY": "REDACTED", "alt-svc": "h3=\":443\"; ma=86400" }, - "data": "{\n \"id\": \"chatcmpl-AKy0ZRtZseiOkgjAWEGTheov8ENF5\",\n \"object\": \"chat.completion\",\n \"created\": 1729560595,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_gckflj1LwRqqPKTFyFEfIgVd\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"serper_tool\",\n \"arguments\": \"{\\\"query\\\":\\\"current president of the United States\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 213,\n \"completion_tokens\": 20,\n \"total_tokens\": 233,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} \ No newline at end of file + "data": "{\n \"id\": \"chatcmpl-AMOiMZWGVjGH1XQtR6o30UZTXAdzO\",\n \"object\": \"chat.completion\",\n \"created\": 1729901582,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_E6Np3xjfgSUPIxXhcatZ7hcA\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"serper_tool\",\n \"arguments\": \"{\\\"query\\\":\\\"current president of the United States\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 213,\n \"completion_tokens\": 20,\n \"total_tokens\": 233,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_ed14c08274\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Tools/SerperTestAgent-9e49a87ac181a72a979874028f1f6034.json b/tests/Fixtures/Saloon/Tools/SerperTestAgent-9e49a87ac181a72a979874028f1f6034.json new file mode 100644 index 0000000..62bfb67 --- /dev/null +++ b/tests/Fixtures/Saloon/Tools/SerperTestAgent-9e49a87ac181a72a979874028f1f6034.json @@ -0,0 +1,27 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 26 Oct 2024 00:13:05 GMT", + "Content-Type": "application\/json", + "Content-Length": "723", + "Connection": "keep-alive", + "access-control-expose-headers": "X-Request-ID", + "openai-organization": "REDACTED", + "openai-processing-ms": "943", + "openai-version": "2020-10-01", + "x-ratelimit-limit-requests": "10000", + "x-ratelimit-limit-tokens": "2000000", + "x-ratelimit-remaining-requests": "9999", + "x-ratelimit-remaining-tokens": "1998979", + "x-ratelimit-reset-requests": "6ms", + "x-ratelimit-reset-tokens": "30ms", + "x-request-id": "REDACTED", + "strict-transport-security": "max-age=31536000; includeSubDomains; preload", + "CF-Cache-Status": "DYNAMIC", + "X-Content-Type-Options": "nosniff", + "Server": "cloudflare", + "CF-RAY": "REDACTED", + "alt-svc": "h3=\":443\"; ma=86400" + }, + "data": "{\n \"id\": \"chatcmpl-AMOiOeKXsB4MvRubcAlCg5BrGFVVm\",\n \"object\": \"chat.completion\",\n \"created\": 1729901584,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Joe Biden is the current president of the United States.\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1130,\n \"completion_tokens\": 23,\n \"total_tokens\": 1153,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_ed14c08274\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Tools/SerperTestAgent-f7bf86866f50c4d6aa1c3352ff0b6f8c.json b/tests/Fixtures/Saloon/Tools/SerperTestAgent-f7bf86866f50c4d6aa1c3352ff0b6f8c.json deleted file mode 100644 index 5e75921..0000000 --- a/tests/Fixtures/Saloon/Tools/SerperTestAgent-f7bf86866f50c4d6aa1c3352ff0b6f8c.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Thu, 24 Oct 2024 01:34:23 GMT", - "Content-Type": "application\/json", - "Content-Length": "674", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-ALh1yZ5j6xTEBEKFVf3GSWKOTiPdq\",\n \"object\": \"chat.completion\",\n \"created\": 1729733662,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Joe Biden\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 321,\n \"completion_tokens\": 15,\n \"total_tokens\": 336,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-15f86e44009e468d98a2182a922488fc.json b/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-15f86e44009e468d98a2182a922488fc.json deleted file mode 100644 index d1182af..0000000 --- a/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-15f86e44009e468d98a2182a922488fc.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:26:14 GMT", - "Content-Type": "application\/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AKxwju2mXu9Jiq45DYAl78d38xGoB\",\n \"object\": \"chat.completion\",\n \"created\": 1729560357,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"pdfs\\\": [\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/STCASSEMBLIESPIOSONICSERIES2018.pdf\\\",\\n \\\"title\\\": \\\"Acoustic Assemblies\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/PiocaneFEMAICC500residentialsaferooms.pdf\\\",\\n \\\"title\\\": \\\"Tornado Resistant Door For Residential Safe Rooms Complies With ICC 500\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/PiocaneFEMAICC500SHELTERSINGLEMOTIONLOCKS.pdf\\\",\\n \\\"title\\\": \\\"Tornado Resistant Door For Shelters With Single Motion Locks Complies With ICC 500\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/Piocane50StorefrontHVHZ11.pdf\\\",\\n \\\"title\\\": \\\"+\/- 50 Psf Hurricane Rated Storefront Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/PIOCANE50FG.pdf\\\",\\n \\\"title\\\": \\\"+\/- 50 Psf Hurricane Rated Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/Piocane70HVHZ1.pdf\\\",\\n \\\"title\\\": \\\"+\/- 70 Psf Hurricane Rated Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/1-PIOCANE-50FG.pdf\\\",\\n \\\"title\\\": \\\"+\/- 50 Psf Hurricane Rated Full Glass Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/SBR16.pdf\\\",\\n \\\"title\\\": \\\"Engineering Details For Blast Resistant Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/BR752DOORASSEMBLY.pdf\\\",\\n \\\"title\\\": \\\"Bullet Resistant Door Complies With UL 752 Level 1 And Level 3\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n }\\n ]\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1985,\n \"completion_tokens\": 609,\n \"total_tokens\": 2594,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-391e03d399bbd1bfda18308c0ddfd184.json b/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-391e03d399bbd1bfda18308c0ddfd184.json deleted file mode 100644 index e6a8137..0000000 --- a/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-391e03d399bbd1bfda18308c0ddfd184.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Sun, 06 Oct 2024 22:32:07 GMT", - "Content-Type": "application\/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AFU4zoKqyV4YDMyikqnFRou4sgKhr\",\n \"object\": \"chat.completion\",\n \"created\": 1728253909,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"pdfs\\\": [\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/STCASSEMBLIESPIOSONICSERIES2018.pdf\\\",\\n \\\"title\\\": \\\"Acoustic Assemblies\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Acoustical Door Assembly\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/PiocaneFEMAICC500residentialsaferooms.pdf\\\",\\n \\\"title\\\": \\\"Tornado Resistant Door for Residential Safe Rooms Complies With ICC 500\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Tornado Resistant Door for Residential Safe Rooms\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/PiocaneFEMAICC500SHELTERSINGLEMOTIONLOCKS.pdf\\\",\\n \\\"title\\\": \\\"Tornado Resistant Door for Shelters with Single Motion Locks Complies With ICC 500\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Tornado Resistant Door for Shelters\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/Piocane50StorefrontHVHZ11.pdf\\\",\\n \\\"title\\\": \\\"+\/- 50 Psf Hurricane Rated Storefront Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Hurricane Rated Storefront Assembly\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/PIOCANE50FG.pdf\\\",\\n \\\"title\\\": \\\"+\/- 50 Psf Hurricane Rated Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Hurricane Rated Door Assembly\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/Piocane70HVHZ1.pdf\\\",\\n \\\"title\\\": \\\"+\/- 70 Psf Hurricane Rated Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Hurricane Rated Door Assembly\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/1-PIOCANE-50 FG.pdf\\\",\\n \\\"title\\\": \\\"+\/- 50 Psf Hurricane Rated Full Glass Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Hurricane Rated Full Glass Door Assembly\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/SBR16.pdf\\\",\\n \\\"title\\\": \\\"Engineering Details for Blast Resistant Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Blast Resistant Door Assembly\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/BR752DOORASSEMBLY.pdf\\\",\\n \\\"title\\\": \\\"Bullet Resistant Door Complies with Ul 752 Level 1 and Level 3\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Bullet Resistant Door\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n }\\n ]\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1422,\n \"completion_tokens\": 721,\n \"total_tokens\": 2143,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_82bed303cf\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-39bc17d178807a04cb3b9318f2573b99.json b/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-39bc17d178807a04cb3b9318f2573b99.json deleted file mode 100644 index 9744743..0000000 --- a/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-39bc17d178807a04cb3b9318f2573b99.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Tue, 22 Oct 2024 01:25:57 GMT", - "Content-Type": "application\/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AKxwRsoeeJ1sH3EPs1aVo6qG616Xq\",\n \"object\": \"chat.completion\",\n \"created\": 1729560339,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"pdfs\\\": [\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/STCASSEMBLIESPIOSONICSERIES2018.pdf\\\",\\n \\\"title\\\": \\\"Acoustic Assemblies\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/PiocaneFEMAICC500residentialsaferooms.pdf\\\",\\n \\\"title\\\": \\\"Tornado Resistant Door For Residential Safe Rooms Complies With ICC 500\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/PiocaneFEMAICC500SHELTERSINGLEMOTIONLOCKS.pdf\\\",\\n \\\"title\\\": \\\"Tornado Resistant Door For Shelters With Single Motion Locks Complies With ICC 500\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/Piocane50StorefrontHVHZ11.pdf\\\",\\n \\\"title\\\": \\\"+\/- 50 Psf Hurricane Rated Storefront Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/PIOCANE50FG.pdf\\\",\\n \\\"title\\\": \\\"+\/-50 Psf Hurricane Rated Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/Piocane70HVHZ1.pdf\\\",\\n \\\"title\\\": \\\"+\/- 70 Psf Hurricane Rated Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/1-PIOCANE-50 FG.pdf\\\",\\n \\\"title\\\": \\\"+\/- 50 Psf Hurricane Rated Full Glass Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/SBR16.pdf\\\",\\n \\\"title\\\": \\\"Engineering Details For Blast Resistant Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/BR752DOORASSEMBLY.pdf\\\",\\n \\\"title\\\": \\\"Bullet Resistant Door Complies With UL 752 Level 1 And Level3\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n }\\n ]\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1119,\n \"completion_tokens\": 607,\n \"total_tokens\": 1726,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_eae715ec6a\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-3ad8cdc0143898a9c2715861e2e3b459.json b/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-3ad8cdc0143898a9c2715861e2e3b459.json deleted file mode 100644 index 1b6c5ad..0000000 --- a/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-3ad8cdc0143898a9c2715861e2e3b459.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Sun, 06 Oct 2024 00:09:20 GMT", - "Content-Type": "application/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AF97aVsLsvZV2Sa844jmWimo1maAQ\",\n \"object\": \"chat.completion\",\n \"created\": 1728173346,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"pdfs\\\": [\\n {\\n \\\"link\\\": \\\"/var/uploads/STCASSEMBLIESPIOSONICSERIES2018.pdf\\\",\\n \\\"title\\\": \\\"Acoustic Assemblies\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"/var/uploads/PiocaneFEMAICC500residentialsaferooms.pdf\\\",\\n \\\"title\\\": \\\"Tornado Resistant Door for Residential Safe Rooms Complies with ICC 500\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"/var/uploads/PiocaneFEMAICC500SHELTERSINGLEMOTIONLOCKS.pdf\\\",\\n \\\"title\\\": \\\"Tornado Resistant Door for Shelters with Single Motion Locks Complies with ICC 500\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"/var/uploads/Piocane50StorefrontHVHZ11.pdf\\\",\\n \\\"title\\\": \\\"+/- 50 Psf Hurricane Rated Storefront Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"/var/uploads/PIOCANE50FG.pdf\\\",\\n \\\"title\\\": \\\"+/- 50 Psf Hurricane Rated Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"/var/uploads/Piocane70HVHZ1.pdf\\\",\\n \\\"title\\\": \\\"+/- 70 Psf Hurricane Rated Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"/var/uploads/1-PIOCANE-50_FG.pdf\\\",\\n \\\"title\\\": \\\"+/- 50 Psf Hurricane Rated Full Glass Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"/var/uploads/SBR16.pdf\\\",\\n \\\"title\\\": \\\"Engineering Details for Blast Resistant Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"/var/uploads/BR752DOORASSEMBLY.pdf\\\",\\n \\\"title\\\": \\\"Bullet Resistant Door Complies with UL 752 Level 1 and Level 3\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n }\\n ]\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1084,\n \"completion_tokens\": 612,\n \"total_tokens\": 1696,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_82bed303cf\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-78b21fef39089d0fc8f6d5fa86f6b943.json b/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-78b21fef39089d0fc8f6d5fa86f6b943.json deleted file mode 100644 index 16b6644..0000000 --- a/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-78b21fef39089d0fc8f6d5fa86f6b943.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Sun, 06 Oct 2024 00:20:07 GMT", - "Content-Type": "application\/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AF9I0xv6sTsRg1nB9sXKu6qFtuskE\",\n \"object\": \"chat.completion\",\n \"created\": 1728173992,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"pdfs.*\\\": \\\"An array of PDF links extracted from the website content.\\\",\\n \\\"pdfs.*.link\\\": \\\"(required|url) The link URL for the PDF.\\\",\\n \\\"pdfs.*.title\\\": \\\"(required|string) The Title of the PDF (usually the link text) in title case.\\\",\\n \\\"pdfs.*.category\\\": \\\"(required|string) One of `Order Form`, `Technical Data`, `Catalog`, `Parts Manual`, `Brochure`, `Template`, `Miscellaneous`\\\",\\n \\\"pdfs.*.product\\\": \\\"(sometimes|string) If this PDF relates to a specific product put the name here.\\\",\\n \\\"pdfs.*.product_category\\\": \\\"(sometimes|string) One of `Doors`, `Frames`, `Door Assemblies`\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 889,\n \"completion_tokens\": 165,\n \"total_tokens\": 1054,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_81dd8129df\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-7df97c9fde0e54abd5268b1e4fa76fca.json b/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-7df97c9fde0e54abd5268b1e4fa76fca.json deleted file mode 100644 index bfb327a..0000000 --- a/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-7df97c9fde0e54abd5268b1e4fa76fca.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Sun, 06 Oct 2024 22:35:25 GMT", - "Content-Type": "application\/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AFU8BJqvx0ILOM8ZdA7aSLwaeRDd2\",\n \"object\": \"chat.completion\",\n \"created\": 1728254107,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"pdfs\\\": [\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/STCASSEMBLIESPIOSONICSERIES2018.pdf\\\",\\n \\\"title\\\": \\\"Acoustic Assemblies\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Acoustic Door Assemblies\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/PiocaneFEMAICC500residentialsaferooms.pdf\\\",\\n \\\"title\\\": \\\"Tornado Resistant Door for Residential Safe Rooms Complies With ICC 500\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Tornado Resistant Door\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/PiocaneFEMAICC500SHELTERSINGLEMOTIONLOCKS.pdf\\\",\\n \\\"title\\\": \\\"Tornado Resistant Door for Shelters with Single Motion Locks Complies With ICC 500\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Tornado Resistant Door\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/Piocane50StorefrontHVHZ11.pdf\\\",\\n \\\"title\\\": \\\"+\/- 50 Psf Hurricane Rated Storefront Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Hurricane Rated Storefront Assembly\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/PIOCANE50FG.pdf\\\",\\n \\\"title\\\": \\\"+\/- 50 Psf Hurricane Rated Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Hurricane Rated Door Assembly\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/Piocane70HVHZ1.pdf\\\",\\n \\\"title\\\": \\\"+\/- 70 Psf Hurricane Rated Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Hurricane Rated Door Assembly\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/1-PIOCANE-50FG.pdf\\\",\\n \\\"title\\\": \\\"+\/- 50 Psf Hurricane Rated Full Glass Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Hurricane Rated Full Glass Door Assembly\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/SBR16.pdf\\\",\\n \\\"title\\\": \\\"Engineering Details for Blast Resistant Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Blast Resistant Door Assembly\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/BR752DOORASSEMBLY.pdf\\\",\\n \\\"title\\\": \\\"Bullet Resistant Door Complies With UL 752 Level 1 and Level 3\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Bullet Resistant Door\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n }\\n ]\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1890,\n \"completion_tokens\": 714,\n \"total_tokens\": 2604,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_81dd8129df\"\n}\n" -} diff --git a/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-e71e66e0e81b0a350fd4cc375719fc88.json b/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-e71e66e0e81b0a350fd4cc375719fc88.json deleted file mode 100644 index 410ae7d..0000000 --- a/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-e71e66e0e81b0a350fd4cc375719fc88.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "statusCode": 200, - "headers": { - "Date": "Sun, 06 Oct 2024 22:35:07 GMT", - "Content-Type": "application/json", - "Transfer-Encoding": "chunked", - "Connection": "keep-alive" - }, - "data": "{\n \"id\": \"chatcmpl-AFU7tWxXyY80yDwwLn4pDZJX4Ig1s\",\n \"object\": \"chat.completion\",\n \"created\": 1728254089,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"pdfs\\\": [\\n {\\n \\\"link\\\": \\\"https://www.pioneerindustries.com/var/uploads/STCASSEMBLIESPIOSONICSERIES2018.pdf\\\",\\n \\\"title\\\": \\\"Acoustic Assemblies\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Acoustic Assemblies\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https://www.pioneerindustries.com/var/uploads/PiocaneFEMAICC500residentialsaferooms.pdf\\\",\\n \\\"title\\\": \\\"Tornado Resistant Door For Residential Safe Rooms Complies With ICC 500\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Tornado Resistant Door\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https://www.pioneerindustries.com/var/uploads/PiocaneFEMAICC500SHELTERSINGLEMOTIONLOCKS.pdf\\\",\\n \\\"title\\\": \\\"Tornado Resistant Door For Shelters With Single Motion Locks Complies With ICC 500\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Tornado Resistant Door\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https://www.pioneerindustries.com/var/uploads/Piocane50StorefrontHVHZ11.pdf\\\",\\n \\\"title\\\": \\\"+/- 50 Psf Hurricane Rated Storefront Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Hurricane Rated Storefront Assembly\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https://www.pioneerindustries.com/var/uploads/PIOCANE50FG.pdf\\\",\\n \\\"title\\\": \\\"+/- 50 Psf Hurricane Rated Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Hurricane Rated Door Assembly\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https://www.pioneerindustries.com/var/uploads/Piocane70HVHZ1.pdf\\\",\\n \\\"title\\\": \\\"+/- 70 Psf Hurricane Rated Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Hurricane Rated Door Assembly\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https://www.pioneerindustries.com/var/uploads/1-PIOCANE-50 FG.pdf\\\",\\n \\\"title\\\": \\\"+/- 50 Psf Hurricane Rated Full Glass Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Hurricane Rated Full Glass Door Assembly\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https://www.pioneerindustries.com/var/uploads/SBR16.pdf\\\",\\n \\\"title\\\": \\\"Engineering Details For Blast Resistant Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Blast Resistant Door Assembly\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https://www.pioneerindustries.com/var/uploads/BR752DOORASSEMBLY.pdf\\\",\\n \\\"title\\\": \\\"Bullet Resistant Door Complies With UL 752 Level 1 And Level 3\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product\\\": \\\"Bullet Resistant Door\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n }\\n ]\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1656,\n \"completion_tokens\": 713,\n \"total_tokens\": 2369,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_82bed303cf\"\n}\n" -} diff --git a/tests/Integrations/ClaudeIntegrationTest.php b/tests/Integrations/ClaudeIntegrationTest.php index edaec0f..87b5238 100644 --- a/tests/Integrations/ClaudeIntegrationTest.php +++ b/tests/Integrations/ClaudeIntegrationTest.php @@ -106,5 +106,5 @@ protected function resolveTools(): array expect($agentResponseArray['content'])->toBeArray() ->and($agentResponseArray['content'])->toHaveKey('answer') - ->and($agentResponseArray['content']['answer'])->toContain('The current president of the United States is Joe Biden. He is the 46th president, having taken office in 2021.'); + ->and($agentResponseArray['content']['answer'])->toContain('The current president of the United States is Joe Biden. He is the 46th president of the United States, having taken office in 2021. Biden previously served as the 47th Vice President of the United States and represented Delaware in the U.S. Senate for 36 years before becoming president.'); }); diff --git a/tests/Integrations/OllamaIntegrationTest.php b/tests/Integrations/OllamaIntegrationTest.php index d3769f3..07c87fc 100644 --- a/tests/Integrations/OllamaIntegrationTest.php +++ b/tests/Integrations/OllamaIntegrationTest.php @@ -2,21 +2,21 @@ declare(strict_types=1); -use Saloon\Http\Faking\Fixture; -use Saloon\Http\Faking\MockClient; -use Saloon\Http\Faking\MockResponse; -use Saloon\Http\PendingRequest; -use UseTheFork\Synapse\Agent; -use UseTheFork\Synapse\Contracts\Agent\HasIntegration; -use UseTheFork\Synapse\Contracts\Integration; -use UseTheFork\Synapse\Integrations\Connectors\Ollama\Requests\ChatRequest; -use UseTheFork\Synapse\Integrations\OllamaIntegration; -use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; -use UseTheFork\Synapse\Tools\Search\SerperTool; -use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; -use UseTheFork\Synapse\ValueObject\SchemaRule; - -test('Connects', function (): void { + use Saloon\Http\Faking\Fixture; + use Saloon\Http\Faking\MockClient; + use Saloon\Http\Faking\MockResponse; + use Saloon\Http\PendingRequest; + use UseTheFork\Synapse\Agent; + use UseTheFork\Synapse\Contracts\Agent\HasIntegration; + use UseTheFork\Synapse\Contracts\Integration; + use UseTheFork\Synapse\Integrations\Connectors\Ollama\Requests\ChatRequest; + use UseTheFork\Synapse\Integrations\OllamaIntegration; + use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; + use UseTheFork\Synapse\Tools\Search\SerperTool; + use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; + use UseTheFork\Synapse\ValueObject\SchemaRule; + + test('Connects', function (): void { class OllamaTestAgent extends Agent implements HasIntegration { @@ -56,7 +56,7 @@ public function resolveOutputSchema(): array expect($agentResponseArray['content'])->toBeArray() ->and($agentResponseArray['content'])->toHaveKey('answer') - ->and($agentResponseArray['content']['answer'])->toBe('Hello!'); + ->and($agentResponseArray['content']['answer'])->toBe('Hi there!'); }); test('uses tools', function (): void { @@ -106,5 +106,5 @@ protected function resolveTools(): array expect($agentResponseArray['content'])->toBeArray() ->and($agentResponseArray['content'])->toHaveKey('answer') - ->and($agentResponseArray['content']['answer'])->toBe('Joe Biden is the current President of the United States.'); + ->and($agentResponseArray['content']['answer'])->toBe('Joe Biden is the current president of the United States.'); }); diff --git a/tests/Integrations/OpenAiIntegrationTest.php b/tests/Integrations/OpenAiIntegrationTest.php index 61444b2..6982737 100644 --- a/tests/Integrations/OpenAiIntegrationTest.php +++ b/tests/Integrations/OpenAiIntegrationTest.php @@ -13,6 +13,7 @@ use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; use UseTheFork\Synapse\Integrations\OpenAIIntegration; use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; +use UseTheFork\Synapse\Tests\Fixtures\OpenAi\OpenAiFixture; use UseTheFork\Synapse\Tools\Search\SerperTool; use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; use UseTheFork\Synapse\ValueObject\SchemaRule; @@ -38,7 +39,7 @@ public function resolveOutputSchema(): array } MockClient::global([ - ChatRequest::class => MockResponse::fixture('Integrations/OpenAiWithOutResolveTestAgent'), + ChatRequest::class => new OpenAiFixture('Integrations/OpenAiWithOutResolveTestAgent'), ]); $agent = new OpenAiWithOutResolveTestAgent; @@ -77,7 +78,7 @@ public function resolveOutputSchema(): array } MockClient::global([ - ChatRequest::class => MockResponse::fixture('Integrations/OpenAiTestAgent'), + ChatRequest::class => new OpenAiFixture('Integrations/OpenAiTestAgent'), ]); $agent = new OpenAiTestAgent; @@ -124,7 +125,7 @@ protected function resolveTools(): array ChatRequest::class => function (PendingRequest $pendingRequest): Fixture { $hash = md5(json_encode($pendingRequest->body()->get('messages'))); - return MockResponse::fixture("Integrations/OpenAiToolTestAgent-{$hash}"); + return new OpenAiFixture("Integrations/OpenAiToolTestAgent-{$hash}"); }, SerperSearchRequest::class => MockResponse::fixture('Integrations/OpenAiToolTestAgent-Serper-Tool'), ]); diff --git a/tests/Tools/ClearbitCompanyToolTest.php b/tests/Tools/ClearbitCompanyToolTest.php index 1b68000..5aa2509 100644 --- a/tests/Tools/ClearbitCompanyToolTest.php +++ b/tests/Tools/ClearbitCompanyToolTest.php @@ -2,7 +2,6 @@ declare(strict_types=1); - use Saloon\Http\Faking\Fixture; use Saloon\Http\Faking\MockClient; use Saloon\Http\Faking\MockResponse; use Saloon\Http\PendingRequest; @@ -15,6 +14,7 @@ use UseTheFork\Synapse\Integrations\OpenAIIntegration; use UseTheFork\Synapse\Memory\CollectionMemory; use UseTheFork\Synapse\Services\Clearbit\Requests\ClearbitCompanyRequest; + use UseTheFork\Synapse\Tests\Fixtures\OpenAi\OpenAiFixture; use UseTheFork\Synapse\Tools\BaseTool; use UseTheFork\Synapse\Tools\ClearbitCompanyTool; use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; @@ -56,10 +56,9 @@ protected function resolveTools(): array } MockClient::global([ - ChatRequest::class => function (PendingRequest $pendingRequest): Fixture { + ChatRequest::class => function (PendingRequest $pendingRequest): OpenAiFixture { $hash = md5(json_encode($pendingRequest->body()->get('messages'))); - - return MockResponse::fixture("Tools/ClearbitCompanyTool-{$hash}"); + return new OpenAiFixture("Tools/ClearbitCompanyTool-{$hash}"); }, ClearbitCompanyRequest::class => MockResponse::fixture('Tools/ClearbitCompanyTool-Tool'), ]); @@ -70,7 +69,7 @@ protected function resolveTools(): array $agentResponseArray = $message->toArray(); expect($agentResponseArray['content'])->toBeArray() ->and($agentResponseArray['content'])->toHaveKey('answer') - ->and($agentResponseArray['content']['answer'])->toContain('OpenAI, legally known as OpenAI, Inc., is an AI research company dedicated to developing safe and beneficial artificial intelligence that aligns with human values and promotes diversity in technology.'); + ->and($agentResponseArray['content']['answer'])->toContain('OpenAI, Inc. is an AI research company dedicated to creating and promoting friendly AI in a way that benefits humanity as a whole.'); }); diff --git a/tests/Tools/CrunchbaseToolTest.php b/tests/Tools/CrunchbaseToolTest.php index e8ffae3..922953c 100644 --- a/tests/Tools/CrunchbaseToolTest.php +++ b/tests/Tools/CrunchbaseToolTest.php @@ -2,7 +2,6 @@ declare(strict_types=1); - use Saloon\Http\Faking\Fixture; use Saloon\Http\Faking\MockClient; use Saloon\Http\Faking\MockResponse; use Saloon\Http\PendingRequest; @@ -15,6 +14,7 @@ use UseTheFork\Synapse\Integrations\OpenAIIntegration; use UseTheFork\Synapse\Memory\CollectionMemory; use UseTheFork\Synapse\Services\Crunchbase\Requests\CrunchbaseRequest; + use UseTheFork\Synapse\Tests\Fixtures\OpenAi\OpenAiFixture; use UseTheFork\Synapse\Tools\BaseTool; use UseTheFork\Synapse\Tools\CrunchbaseTool; use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; @@ -56,10 +56,9 @@ protected function resolveTools(): array } MockClient::global([ - ChatRequest::class => function (PendingRequest $pendingRequest): Fixture { + ChatRequest::class => function (PendingRequest $pendingRequest): OpenAiFixture { $hash = md5(json_encode($pendingRequest->body()->get('messages'))); - - return MockResponse::fixture("Tools/CrunchbaseTool-{$hash}"); + return new OpenAiFixture("Tools/CrunchbaseTool-{$hash}"); }, CrunchbaseRequest::class => MockResponse::fixture('Tools/CrunchbaseTool-Tool'), ]); @@ -70,7 +69,7 @@ protected function resolveTools(): array $agentResponseArray = $message->toArray(); expect($agentResponseArray['content'])->toBeArray() ->and($agentResponseArray['content'])->toHaveKey('answer') - ->and($agentResponseArray['content']['answer'])->toContain('Siteimprove offers comprehensive cloud-based digital presence optimization software. Located in Copenhagen, Denmark, the company also has locations in Hovedstade'); + ->and($agentResponseArray['content']['answer'])->toContain('Siteimprove is a company that provides comprehensive cloud-based digital presence optimization software.'); }); diff --git a/tests/Tools/FirecrawlToolTest.php b/tests/Tools/FirecrawlToolTest.php index f8ffd19..63b4f03 100644 --- a/tests/Tools/FirecrawlToolTest.php +++ b/tests/Tools/FirecrawlToolTest.php @@ -2,25 +2,23 @@ declare(strict_types=1); -use Saloon\Http\Faking\Fixture; -use Saloon\Http\Faking\MockClient; -use Saloon\Http\Faking\MockResponse; -use Saloon\Http\PendingRequest; -use UseTheFork\Synapse\Agent; -use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; -use UseTheFork\Synapse\Contracts\Integration; -use UseTheFork\Synapse\Contracts\Memory; -use UseTheFork\Synapse\Contracts\Tool; -use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; -use UseTheFork\Synapse\Integrations\OpenAIIntegration; -use UseTheFork\Synapse\Memory\CollectionMemory; -use UseTheFork\Synapse\Services\Firecrawl\Requests\FirecrawlRequest; -use UseTheFork\Synapse\Tools\BaseTool; -use UseTheFork\Synapse\Tools\Scrape\FirecrawlTool; -use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; -use UseTheFork\Synapse\ValueObject\SchemaRule; - -test('Firecrawl Tool', function (): void { + use Saloon\Http\Faking\MockClient; + use Saloon\Http\Faking\MockResponse; + use Saloon\Http\PendingRequest; + use UseTheFork\Synapse\Agent; + use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; + use UseTheFork\Synapse\Contracts\Integration; + use UseTheFork\Synapse\Contracts\Tool; + use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; + use UseTheFork\Synapse\Integrations\OpenAIIntegration; + use UseTheFork\Synapse\Services\Firecrawl\Requests\FirecrawlRequest; + use UseTheFork\Synapse\Tests\Fixtures\OpenAi\OpenAiFixture; + use UseTheFork\Synapse\Tools\BaseTool; + use UseTheFork\Synapse\Tools\Scrape\FirecrawlTool; + use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; + use UseTheFork\Synapse\ValueObject\SchemaRule; + + test('Firecrawl Tool', function (): void { class FirecrawlToolTestAgent extends Agent implements HasOutputSchema { @@ -33,11 +31,6 @@ public function resolveIntegration(): Integration return new OpenAIIntegration; } - public function resolveMemory(): Memory - { - return new CollectionMemory; - } - public function resolveOutputSchema(): array { return [ @@ -56,10 +49,9 @@ protected function resolveTools(): array } MockClient::global([ - ChatRequest::class => function (PendingRequest $pendingRequest): Fixture { + ChatRequest::class => function (PendingRequest $pendingRequest): OpenAiFixture { $hash = md5(json_encode($pendingRequest->body()->get('messages'))); - - return MockResponse::fixture("Tools/FirecrawlTool-{$hash}"); + return new OpenAiFixture("Tools/FirecrawlTool-{$hash}"); }, FirecrawlRequest::class => MockResponse::fixture('Tools/FirecrawlTool-Tool'), ]); @@ -70,7 +62,7 @@ protected function resolveTools(): array $agentResponseArray = $message->toArray(); expect($agentResponseArray['content'])->toBeArray() ->and($agentResponseArray['content'])->toHaveKey('answer') - ->and($agentResponseArray['content']['answer'])->toContain("The 'https://www.firecrawl.dev/' page is about Firecrawl, a service that allows users to crawl and scrape data from websites, transforming it into clean, structured markdown or data that is ready for LLM (Large Language Models) applications. It provides various features including handling dynamic content, rotating proxies, and scraping without needing a sitemap. Firecrawl offers different pricing plans, is open source, and aims to power AI applications by providing reliable, clean data extracted from any website."); + ->and($agentResponseArray['content']['answer'])->toContain("Firecrawl is a service that provides web scraping and data crawling capabilities focusing on delivering clean, LLM-ready (Large Language Models) data from websites."); }); diff --git a/tests/Tools/SerperToolTest.php b/tests/Tools/SerperToolTest.php index 49e5c7f..c305086 100644 --- a/tests/Tools/SerperToolTest.php +++ b/tests/Tools/SerperToolTest.php @@ -2,23 +2,23 @@ declare(strict_types=1); - use Saloon\Http\Faking\Fixture; - use Saloon\Http\Faking\MockClient; - use Saloon\Http\Faking\MockResponse; - use Saloon\Http\PendingRequest; - use UseTheFork\Synapse\Agent; - use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; - use UseTheFork\Synapse\Contracts\Integration; - use UseTheFork\Synapse\Contracts\Tool; - use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; - use UseTheFork\Synapse\Integrations\OpenAIIntegration; - use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; - use UseTheFork\Synapse\Tools\BaseTool; - use UseTheFork\Synapse\Tools\Search\SerperTool; - use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; - use UseTheFork\Synapse\ValueObject\SchemaRule; - - test('Serper Tool', function (): void { + use Saloon\Http\Faking\MockClient; + use Saloon\Http\Faking\MockResponse; + use Saloon\Http\PendingRequest; + use UseTheFork\Synapse\Agent; + use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; + use UseTheFork\Synapse\Contracts\Integration; + use UseTheFork\Synapse\Contracts\Tool; + use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; + use UseTheFork\Synapse\Integrations\OpenAIIntegration; + use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; + use UseTheFork\Synapse\Tests\Fixtures\OpenAi\OpenAiFixture; + use UseTheFork\Synapse\Tools\BaseTool; + use UseTheFork\Synapse\Tools\Search\SerperTool; + use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; + use UseTheFork\Synapse\ValueObject\SchemaRule; + + test('Serper Tool', function (): void { class SerperTestAgent extends Agent implements HasOutputSchema { @@ -49,10 +49,9 @@ protected function resolveTools(): array } MockClient::global([ - ChatRequest::class => function (PendingRequest $pendingRequest): Fixture { + ChatRequest::class => function (PendingRequest $pendingRequest): OpenAiFixture { $hash = md5(json_encode($pendingRequest->body()->get('messages'))); - - return MockResponse::fixture("Tools/SerperTestAgent-{$hash}"); + return new OpenAiFixture("Tools/SerperTestAgent-{$hash}"); }, SerperSearchRequest::class => MockResponse::fixture('Tools/Serper-Tool'), ]); @@ -63,7 +62,9 @@ protected function resolveTools(): array $agentResponseArray = $message->toArray(); expect($agentResponseArray['content'])->toBeArray() - ->and($agentResponseArray['content'])->toHaveKey('answer'); + ->and($agentResponseArray['content'])->toHaveKey('answer') + ->and($agentResponseArray['content']['answer'])->toContain('Joe Biden is the current president of the United States.') + ; }); From c7966b4788e686f0e5371eb79a617779bf658130 Mon Sep 17 00:00:00 2001 From: use-the-fork Date: Fri, 25 Oct 2024 20:25:54 -0400 Subject: [PATCH 5/7] refactor(search-tools): enhance result formatting with structured JSON output - Transformed Google News and Search results to structured JSON format. - Enhanced consistency and clarity for news stories and organic results. - Improved error handling with structured JSON for "no results" scenarios. --- src/Tools/Search/SerpAPIGoogleNewsTool.php | 22 ++++---- src/Tools/Search/SerpAPIGoogleSearchTool.php | 9 ++-- ...Tool-8b5a265c43dea6f4ed40a3d21bd13bf1.json | 27 ++++++++++ ...Tool-931a8013da7ad77812c0c398303da8c6.json | 27 ++++++++++ .../Tools/SerpAPIGoogleNewsTool-Tool.json | 11 ++++ ...Tool-e92c14654ff46872c21a06df358fda88.json | 27 ++++++++++ ...Tool-600667e7881befb7566aabff802e23d8.json | 27 ++++++++++ ...Tool-8c4de06e2a7064e26c30dd1131e7c149.json | 27 ++++++++++ .../Tools/SerpAPIGoogleSearchTool-Tool.json | 12 +++++ tests/Tools/SerpAPIGoogleNewsToolTest.php | 50 ++++++++----------- tests/Tools/SerpAPIGoogleSearchToolTest.php | 45 +++++++---------- 11 files changed, 214 insertions(+), 70 deletions(-) create mode 100644 tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-8b5a265c43dea6f4ed40a3d21bd13bf1.json create mode 100644 tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-931a8013da7ad77812c0c398303da8c6.json create mode 100644 tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-Tool.json create mode 100644 tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-e92c14654ff46872c21a06df358fda88.json create mode 100644 tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-600667e7881befb7566aabff802e23d8.json create mode 100644 tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-8c4de06e2a7064e26c30dd1131e7c149.json create mode 100644 tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-Tool.json diff --git a/src/Tools/Search/SerpAPIGoogleNewsTool.php b/src/Tools/Search/SerpAPIGoogleNewsTool.php index 6370ab4..3d87f70 100644 --- a/src/Tools/Search/SerpAPIGoogleNewsTool.php +++ b/src/Tools/Search/SerpAPIGoogleNewsTool.php @@ -53,30 +53,30 @@ private function parseResults(array $results): string foreach ($newsResults as $newResult) { $result = collect(); - $result->push("```text\n### Title: {$newResult['title']}"); + $result['title'] = $newResult['title']; if (! empty($newResult['stories'])) { foreach (Arr::get($newResult, 'stories', []) as $story) { - - $result->push("#### Story: {$story['title']}"); - $result->push("- Date: {$story['date']}"); - $result->push("- Link: {$story['link']}"); + $result['stories'][] = [ + 'title' => $story['title'], + 'date' => $story['date'], + 'link' => $story['link'], + ]; } } if (! empty($newResult['source'])) { - $result->push("- Date: {$newResult['date']}"); - $result->push("- Link: {$newResult['link']}"); + $result['date'] = $newResult['date']; + $result['link'] = $newResult['link']; } - $result->push("```\n"); - $snippets->push($result->implode("\n")); + $snippets->push($result); } } if ($snippets->isEmpty()) { - return 'No good Google News Result found'; + return json_encode(['title' => 'No Good Google Search Result was found', 'snippet' => '', 'link' => ''], JSON_PRETTY_PRINT); } - return $snippets->implode("\n"); + return json_encode($snippets, JSON_PRETTY_PRINT); } } diff --git a/src/Tools/Search/SerpAPIGoogleSearchTool.php b/src/Tools/Search/SerpAPIGoogleSearchTool.php index b4e4ece..864d131 100644 --- a/src/Tools/Search/SerpAPIGoogleSearchTool.php +++ b/src/Tools/Search/SerpAPIGoogleSearchTool.php @@ -57,6 +57,7 @@ private function parseResults(array $results): string $description = Arr::get($knowledgeGraph, 'description'); if ($description) { $snippets->push($description); + $snippets->push(['type' => 'Knowledge Graph Description', 'value' => $description]); } foreach ($knowledgeGraph as $key => $value) { if ( @@ -67,7 +68,7 @@ private function parseResults(array $results): string ! Str::endsWith($key, '_link') && ! Str::startsWith($value, 'http') ) { - $snippets->push("{$title} {$key}: {$value}."); + $snippets->push(['type' => 'Knowledge Graph Attribute', 'title' => $title, 'key' => $key, 'value' => $value]); } } } @@ -76,14 +77,14 @@ private function parseResults(array $results): string $organicResults = Arr::get($results, 'organic_results'); foreach ($organicResults as $organicResult) { - $snippets->push("```text\nTitle: {$organicResult['title']}\nLink: {$organicResult['link']}\nSnippet: {$organicResult['snippet']}\n```"); + $snippets->push(['type' => 'Organic', 'title' => $organicResult['title'], 'link' => $organicResult['link'], 'snippet' => $organicResult['snippet']]); } } if ($snippets->isEmpty()) { - return 'No good Google Search Result was found'; + return json_encode(['title' => 'No Good Google Search Result was found', 'snippet' => '', 'link' => ''], JSON_PRETTY_PRINT); } - return $snippets->implode("\n"); + return json_encode($snippets, JSON_PRETTY_PRINT); } } diff --git a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-8b5a265c43dea6f4ed40a3d21bd13bf1.json b/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-8b5a265c43dea6f4ed40a3d21bd13bf1.json new file mode 100644 index 0000000..9b224b8 --- /dev/null +++ b/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-8b5a265c43dea6f4ed40a3d21bd13bf1.json @@ -0,0 +1,27 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 26 Oct 2024 00:23:31 GMT", + "Content-Type": "application\/json", + "Content-Length": "959", + "Connection": "keep-alive", + "access-control-expose-headers": "X-Request-ID", + "openai-organization": "REDACTED", + "openai-processing-ms": "1017", + "openai-version": "2020-10-01", + "x-ratelimit-limit-requests": "10000", + "x-ratelimit-limit-tokens": "2000000", + "x-ratelimit-remaining-requests": "9999", + "x-ratelimit-remaining-tokens": "1999870", + "x-ratelimit-reset-requests": "6ms", + "x-ratelimit-reset-tokens": "3ms", + "x-request-id": "REDACTED", + "strict-transport-security": "max-age=31536000; includeSubDomains; preload", + "CF-Cache-Status": "DYNAMIC", + "X-Content-Type-Options": "nosniff", + "Server": "cloudflare", + "CF-RAY": "REDACTED", + "alt-svc": "h3=\":443\"; ma=86400" + }, + "data": "{\n \"id\": \"chatcmpl-AMOsUwBs6HPUh0gSOD743erZmBCyQ\",\n \"object\": \"chat.completion\",\n \"created\": 1729902210,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_FwpuiFgRrdAQKAVO5T8PoscY\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"serp_a_p_i_google_news_tool\",\n \"arguments\": \"{\\\"query\\\":\\\"Apple current headlines\\\",\\\"numberOfResults\\\":5}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 164,\n \"completion_tokens\": 27,\n \"total_tokens\": 191,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_ed14c08274\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-931a8013da7ad77812c0c398303da8c6.json b/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-931a8013da7ad77812c0c398303da8c6.json new file mode 100644 index 0000000..2508826 --- /dev/null +++ b/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-931a8013da7ad77812c0c398303da8c6.json @@ -0,0 +1,27 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 26 Oct 2024 00:23:45 GMT", + "Content-Type": "application/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive", + "access-control-expose-headers": "X-Request-ID", + "openai-organization": "REDACTED", + "openai-processing-ms": "10313", + "openai-version": "2020-10-01", + "x-ratelimit-limit-requests": "10000", + "x-ratelimit-limit-tokens": "2000000", + "x-ratelimit-remaining-requests": "9999", + "x-ratelimit-remaining-tokens": "1993096", + "x-ratelimit-reset-requests": "6ms", + "x-ratelimit-reset-tokens": "207ms", + "x-request-id": "REDACTED", + "strict-transport-security": "max-age=31536000; includeSubDomains; preload", + "CF-Cache-Status": "DYNAMIC", + "X-Content-Type-Options": "nosniff", + "Server": "cloudflare", + "CF-RAY": "REDACTED", + "alt-svc": "h3=\":443\"; ma=86400" + }, + "data": "{\n \"id\": \"chatcmpl-AMOsZWlKyrYfeXmFNITBJVya111Ne\",\n \"object\": \"chat.completion\",\n \"created\": 1729902215,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": [\\n {\\n \\\"title\\\": \\\"Is Apple Stock A Buy Before September-Quarter Earnings?\\\",\\n \\\"date\\\": \\\"10/21/2024, 11:35 AM, +0000 UTC\\\",\\n \\\"link\\\": \\\"https://www.investors.com/news/technology/apple-stock-buy-now-aapl-stock/\\\"\\n },\\n {\\n \\\"title\\\": \\\"Apple Inc. (AAPL) Stock Price, News, Quote & History\\\",\\n \\\"date\\\": \\\"10/11/2024, 11:13 PM, +0000 UTC\\\",\\n \\\"link\\\": \\\"https://finance.yahoo.com/quote/AAPL/\\\"\\n },\\n {\\n \\\"title\\\": \\\"Apple Loop: iPhone 17 Pro Leaks, Surprise iPad Mini Launch, New MacBook Pro Specs\\\",\\n \\\"date\\\": \\\"10/18/2024, 10:57 PM, +0000 UTC\\\",\\n \\\"link\\\": \\\"https://www.forbes.com/sites/ewanspence/2024/10/18/apple-news-headliens-iphone-17-pro-ipad-mini-macbook-pro-macos-ai-iphone-se/\\\"\\n },\\n {\\n \\\"title\\\": \\\"Apple set to unveil iPhone 16 on Monday. Here's what to expect.\\\",\\n \\\"date\\\": \\\"09/09/2024, 07:00 AM, +0000 UTC\\\",\\n \\\"link\\\": \\\"https://www.cbsnews.com/news/apple-iphone-16-what-to-expect/\\\"\\n },\\n {\\n \\\"title\\\": \\\"Apple embraces the AI craze with its newly unleashed iPhone 16 lineup\\\",\\n \\\"date\\\": \\\"09/09/2024, 07:00 AM, +0000 UTC\\\",\\n \\\"link\\\": \\\"https://apnews.com/article/apple-iphone-16-artificial-intelligence-google-samsung-4f30bf40ad89793d80f8ac3a20f9e79c\\\"\\n }\\n ]\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 8669,\n \"completion_tokens\": 411,\n \"total_tokens\": 9080,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_ed14c08274\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-Tool.json b/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-Tool.json new file mode 100644 index 0000000..7f3b208 --- /dev/null +++ b/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-Tool.json @@ -0,0 +1,11 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 26 Oct 2024 00:23:35 GMT", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "69069", + "Connection": "keep-alive", + "x-frame-options": "SAMEORIGIN" + }, + "data": "{\n \"search_metadata\": {\n \"id\": \"671c3683bcd65201e4953d80\",\n \"status\": \"Success\",\n \"json_endpoint\": \"https://serpapi.com/searches/c2b683fdf6694524/671c3683bcd65201e4953d80.json\",\n \"created_at\": \"2024-10-26 00:23:31 UTC\",\n \"processed_at\": \"2024-10-26 00:23:31 UTC\",\n \"google_news_url\": \"https://news.google.com/search?q=Apple+current+headlines\",\n \"raw_html_file\": \"https://serpapi.com/searches/c2b683fdf6694524/671c3683bcd65201e4953d80.html\",\n \"total_time_taken\": 3.18\n },\n \"search_parameters\": {\n \"engine\": \"google_news\",\n \"q\": \"Apple current headlines\"\n },\n \"news_results\": [\n {\n \"position\": 1,\n \"title\": \"Is Apple Stock A Buy Before September-Quarter Earnings?\",\n \"source\": {\n \"name\": \"Investor's Business Daily\",\n \"icon\": \"https://lh3.googleusercontent.com/-m-56Z1d9ObiT3mixbg-CNUkjN8m9UWzzzJ6mm8jJULcnWYyxz5IBCYuZ5cQXy6MQceme7nYRQ\"\n },\n \"link\": \"https://www.investors.com/news/technology/apple-stock-buy-now-aapl-stock/\",\n \"thumbnail\": \"https://www.investors.com/wp-content/uploads/2018/06/stock-apple-35-ahutter-640x360.jpg\",\n \"date\": \"10/21/2024, 11:35 AM, +0000 UTC\"\n },\n {\n \"position\": 2,\n \"title\": \"Apple Inc. (AAPL) Stock Price, News, Quote & History\",\n \"source\": {\n \"name\": \"Yahoo Finance\",\n \"icon\": \"https://lh3.googleusercontent.com/L57n4HUzUS8lNXBPYNGQScsyxaqqx42Nym3-tUk8NzkTvMsa95NhzEqC8KMqVPFpAFpCuPFdlA\"\n },\n \"link\": \"https://finance.yahoo.com/quote/AAPL/\",\n \"date\": \"10/11/2024, 11:13 PM, +0000 UTC\"\n },\n {\n \"position\": 3,\n \"title\": \"Apple Loop: iPhone 17 Pro Leaks, Surprise iPad Mini Launch, New MacBook Pro Specs\",\n \"source\": {\n \"name\": \"Forbes\",\n \"icon\": \"https://lh3.googleusercontent.com/NIjzR9QHtZJllEvJIVkODXFQ7_rbx1BMBXx2rNUbttjuu9YWLIp2_juQaI9jJ2rDtzi6snbZ\",\n \"authors\": [\n \"Ewan Spence\"\n ]\n },\n \"link\": \"https://www.forbes.com/sites/ewanspence/2024/10/18/apple-news-headliens-iphone-17-pro-ipad-mini-macbook-pro-macos-ai-iphone-se/\",\n \"thumbnail\": \"https://imageio.forbes.com/specials-images/imageserve/6712dac49e11953e8e4df3bf/Apple-Begins-Selling-New-iPhone-16-At-Stores-Across-The-Country/960x0.jpg?height=473&width=711&fit=bounds\",\n \"date\": \"10/18/2024, 10:57 PM, +0000 UTC\"\n },\n {\n \"position\": 4,\n \"title\": \"Apple set to unveil iPhone 16 on Monday. Here's what to expect.\",\n \"source\": {\n \"name\": \"CBS News\",\n \"icon\": \"https://lh3.googleusercontent.com/dXy0k7AMf-wXfnj2AtaLk3rZcPGjClkFvKSAQnjoLp9wa_ggxST_WSGqovh984zY8mf3vDmt\",\n \"authors\": [\n \"Megan Cerullo\"\n ]\n },\n \"link\": \"https://www.cbsnews.com/news/apple-iphone-16-what-to-expect/\",\n \"thumbnail\": \"https://assets3.cbsnewsstatic.com/hub/i/r/2024/09/06/54addc5f-0728-44c0-a6ed-82f9c280b1c2/thumbnail/1200x630/7a24cbc0c2d97648057037008029eb18/gettyimages-2156548093.jpg?v=b241b87adbbb7f0a227ed35b96d0cefa\",\n \"date\": \"09/09/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 5,\n \"title\": \"Apple embraces the AI craze with its newly unleashed iPhone 16 lineup\",\n \"source\": {\n \"name\": \"The Associated Press\",\n \"icon\": \"https://lh3.googleusercontent.com/M087pJgRw3PLf4gl-Y7U-tJn6uaN99AUbFIuX7fmMnhq5QeNylJQMq_UeYPPVaEPk-5jL9I3QA\",\n \"authors\": [\n \"Michael Liedtke\"\n ]\n },\n \"link\": \"https://apnews.com/article/apple-iphone-16-artificial-intelligence-google-samsung-4f30bf40ad89793d80f8ac3a20f9e79c\",\n \"thumbnail\": \"https://dims.apnews.com/dims4/default/2d71fbe/2147483647/strip/true/crop/5472x3648+0+0/resize/599x399!/quality/90/?url=https%3A%2F%2Fassets.apnews.com%2Ffc%2F6e%2Fc692a752e1669335caca2261fe74%2F6e07d6ee606d4711b4abe9e152e3a309\",\n \"date\": \"09/09/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 6,\n \"title\": \"Apple picking at Mass. farm ends with racial profiling, scuffle, family says\",\n \"source\": {\n \"name\": \"NBC Boston\",\n \"icon\": \"https://encrypted-tbn0.gstatic.com/faviconV2?url=https://www.nbcboston.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\",\n \"authors\": [\n \"Asher Klein\",\n \"Malcolm Johnson\"\n ]\n },\n \"link\": \"https://www.nbcboston.com/news/local/danvers-apple-picking-racial-profiling-claim/3520353/\",\n \"thumbnail\": \"https://media.nbcboston.com/2024/10/connors-farm-racial-profiling-accusation.png?resize=1200%2C675&quality=85&strip=all\",\n \"date\": \"10/15/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 7,\n \"title\": \"As clicks dry up for news sites, could Apple\u2019s news app be a lifeline?\",\n \"source\": {\n \"name\": \"Semafor\",\n \"icon\": \"https://lh3.googleusercontent.com/AbSzSdrdQUkZJn_qrAwfEK1kmdBsfgLZLMoABj-SujOJMwaEez-tWO1eccFXrV-SmdFQsqT6aA\",\n \"authors\": [\n \"Maxwell Tani\"\n ]\n },\n \"link\": \"https://www.semafor.com/article/05/19/2024/as-clicks-dry-up-for-news-sites-could-apples-news-app-be-a-lifeline\",\n \"thumbnail\": \"https://img.semafor.com/c2462871f6cdaa0cc014ab883b662fc895228f28-1280x961.png?w=1920&q=75&auto=format\",\n \"date\": \"05/19/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 8,\n \"title\": \"NYC buses tout Big Flavor in The Big Apple\",\n \"source\": {\n \"name\": \"The Produce News\",\n \"icon\": \"https://lh3.googleusercontent.com/wuub-wDJCPPgnapHs_ugjjQqBJndZvj7tMby7GC68PvPfNHvKM8WzvOfU9H6X9NYAXEBG_L4\"\n },\n \"link\": \"https://theproducenews.com/headlines/nyc-buses-tout-big-flavor-big-apple\",\n \"thumbnail\": \"https://theproducenews.com/sites/default/files/2024-10/big_0.jpg\",\n \"date\": \"10/03/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 9,\n \"title\": \"The Apple of One Business Reporter\u2019s Eye\",\n \"source\": {\n \"name\": \"The New York Times\",\n \"icon\": \"https://lh3.googleusercontent.com/tDFSwtr61ZReDD_jw6kEPWegHMSqGEHx-ZS_t-e10We-GfWEPVYkn0uLk_Vn8XQHg8wcnhMWmug\",\n \"authors\": [\n \"Josh Ocampo\"\n ]\n },\n \"link\": \"https://www.nytimes.com/2024/07/31/insider/apple-beat.html\",\n \"thumbnail\": \"https://static01.nyt.com/images/2024/08/01/pageoneplus/01a2_insider-Mickle-02/01a2_insider-Mickle-02-articleLarge.jpg?quality=75&auto=webp&disable=upscale\",\n \"date\": \"07/31/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 10,\n \"title\": \"The Athletic joins Apple News+\",\n \"source\": {\n \"name\": \"Apple\",\n \"icon\": \"https://encrypted-tbn2.gstatic.com/faviconV2?url=https://www.apple.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\"\n },\n \"link\": \"https://www.apple.com/newsroom/2023/12/the-athletic-joins-apple-news-plus/\",\n \"thumbnail\": \"https://www.apple.com/newsroom/images/2023/12/the-athletic-joins-apple-news-plus/article/Apple-News-Plus-The-Athletic_inline.jpg.large.jpg\",\n \"date\": \"12/19/2023, 08:00 AM, +0000 UTC\"\n },\n {\n \"position\": 11,\n \"title\": \"Live updates: Apple event; iPhone 16 debuts, designed for AI\",\n \"source\": {\n \"name\": \"CNN\",\n \"icon\": \"https://lh3.googleusercontent.com/8zdvTbISHUn-4iHkauW-_yQSGPD9BMrx9EWfqTIhiVm2YMYqhHC1HJWNDQoSOkMk0MRPYKxjIg\",\n \"authors\": [\n \"Samantha Delouya\",\n \"Elise Hammond\",\n \"Samantha Murphy Kelly\"\n ]\n },\n \"link\": \"https://www.cnn.com/business/live-news/apple-event-iphone-16-09-09-24/index.html\",\n \"thumbnail\": \"https://media.cnn.com/api/v1/images/stellar/prod/iphone16editv2-00-00-09-03-still001.jpg?c=16x9&q=w_1280,c_fill\",\n \"date\": \"09/09/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 12,\n \"title\": \"Apple Event: everything you need to know about the Glowtime launch and what could be next\",\n \"source\": {\n \"name\": \"TechRadar\",\n \"icon\": \"https://lh3.googleusercontent.com/h3jba9VMZkFHG1QVakElUh94ugAfWEJfnBwg-v1YYuGEsB7Xo0Na9-1HSp2RTIvArgKT-D_A5g\",\n \"authors\": [\n \"Jacob Krol\",\n \"Roland Moore-Colyer\"\n ]\n },\n \"link\": \"https://www.techradar.com/news/new-apple-event\",\n \"thumbnail\": \"https://cdn.mos.cms.futurecdn.net/WAPRYR7qjs7ppvRFvW6CVQ-320-80.jpg\",\n \"date\": \"10/07/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 13,\n \"title\": \"Apple News adds a new original game to boost News+ subscriptions\",\n \"source\": {\n \"name\": \"Nieman Journalism Lab at Harvard\",\n \"icon\": \"https://encrypted-tbn1.gstatic.com/faviconV2?url=https://www.niemanlab.org&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\",\n \"authors\": [\n \"Sarah Scire\"\n ]\n },\n \"link\": \"https://www.niemanlab.org/2024/05/apple-news-adds-a-new-original-game-to-boost-news-subscriptions/\",\n \"thumbnail\": \"https://www.niemanlab.org/images/Screenshot-2024-05-14-at-1.55.30%E2%80%AFPM-700x397.png\",\n \"date\": \"05/14/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 14,\n \"title\": \"Get the all-new iPhone 16 Pro on us, when you trade in any phone. In any condition. Guaranteed.\",\n \"source\": {\n \"name\": \"Verizon\",\n \"icon\": \"https://encrypted-tbn2.gstatic.com/faviconV2?url=https://www.verizon.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\"\n },\n \"link\": \"https://www.verizon.com/about/news/apple-iphone-16-pro-verizon-deals\",\n \"thumbnail\": \"https://www.verizon.com/about/sites/default/files/styles/hero_tablet/public/2024-09/Apple-16-Pro-1230x690.jpg\",\n \"date\": \"09/09/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 15,\n \"title\": \"Apple's artificial intelligence features to be delayed, Bloomberg News reports\",\n \"source\": {\n \"name\": \"Reuters\",\n \"icon\": \"https://lh3.googleusercontent.com/OzNZmYwP-Zl3sTWa8dzzyws9hou0ZihOGJ_-qanon-1iB5KwyqcHOwPxYZj54cGMZwD5qXui\"\n },\n \"link\": \"https://www.reuters.com/technology/apples-artificial-intelligence-features-be-delayed-bloomberg-news-reports-2024-07-28/\",\n \"thumbnail\": \"https://cloudfront-us-east-2.images.arcpublishing.com/reuters/QH6Z7UBVIFPPDD2PADPC4E4U4E.jpg\",\n \"date\": \"07/28/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 16,\n \"title\": \"Apple Loop: Apple Confirms iPhone 16 Details, Ted Lasso\u2019s Surprise Return, Final iPhone Design Leaks\",\n \"source\": {\n \"name\": \"Forbes\",\n \"icon\": \"https://lh3.googleusercontent.com/NIjzR9QHtZJllEvJIVkODXFQ7_rbx1BMBXx2rNUbttjuu9YWLIp2_juQaI9jJ2rDtzi6snbZ\",\n \"authors\": [\n \"Ewan Spence\"\n ]\n },\n \"link\": \"https://www.forbes.com/sites/ewanspence/2024/09/01/apple-news-headlines-iphone-16-pro-launch-date-glow-time-ipad-mini-macbook-m4-ted-lasso/\",\n \"thumbnail\": \"https://imageio.forbes.com/specials-images/imageserve/6133b1d73f00df9fdccf31db/Apple-Holds-Press-Event-To-Introduce-New-iPhone/960x0.jpg?height=474&width=711&fit=bounds\",\n \"date\": \"09/01/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 17,\n \"title\": \"Apple's new iPhone 16 unveiled at \\\"Glowtime\\\" event\",\n \"source\": {\n \"name\": \"CBS News\",\n \"icon\": \"https://lh3.googleusercontent.com/dXy0k7AMf-wXfnj2AtaLk3rZcPGjClkFvKSAQnjoLp9wa_ggxST_WSGqovh984zY8mf3vDmt\",\n \"authors\": [\n \"Megan Cerullo\"\n ]\n },\n \"link\": \"https://www.cbsnews.com/news/apple-iphone-16-event-its-glowtime/\",\n \"thumbnail\": \"https://assets2.cbsnewsstatic.com/hub/i/r/2024/09/09/128cd6e9-3b69-4b35-92b7-5d129fd16427/thumbnail/1200x630/487b1ef616f9f1845fc8c287c08d588b/apple-iphone-16-pro-finish-lineup-240909.jpg?v=c72f52c71e431fd7dde1ba5ae2f69280\",\n \"date\": \"09/23/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 18,\n \"title\": \"Apple unveils the new 13- and 15-inch MacBook Air with the powerful M3 chip\",\n \"source\": {\n \"name\": \"Apple\",\n \"icon\": \"https://encrypted-tbn2.gstatic.com/faviconV2?url=https://www.apple.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\"\n },\n \"link\": \"https://www.apple.com/newsroom/2024/03/apple-unveils-the-new-13-and-15-inch-macbook-air-with-the-powerful-m3-chip/\",\n \"thumbnail\": \"https://www.apple.com/newsroom/images/2024/03/apple-unveils-the-new-13-and-15-inch-macbook-air-with-the-powerful-m3-chip/article/Apple-MacBook-Air-2-up-hero-240304_big.jpg.large.jpg\",\n \"date\": \"03/04/2024, 08:00 AM, +0000 UTC\"\n },\n {\n \"position\": 19,\n \"title\": \"Apple Loop: iPhone 16 Pro Design Leaks, Goodbye Apple ID, Confusion Over iPhone 16 Launch Date\",\n \"source\": {\n \"name\": \"Forbes\",\n \"icon\": \"https://lh3.googleusercontent.com/NIjzR9QHtZJllEvJIVkODXFQ7_rbx1BMBXx2rNUbttjuu9YWLIp2_juQaI9jJ2rDtzi6snbZ\",\n \"authors\": [\n \"Ewan Spence\"\n ]\n },\n \"link\": \"https://www.forbes.com/sites/ewanspence/2024/08/25/apple-news-headlines-iphone-16-pro-launch-date-iphone-16-specs-ios18-apple-id/\",\n \"thumbnail\": \"https://imageio.forbes.com/specials-images/imageserve/66c8e269af3f2a30f86abb0c/Street-Style---Dusseldorf---October-2023/0x0.jpg?crop=1557,876,x0,y402,safe&height=400&width=711&fit=bounds\",\n \"date\": \"08/25/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 20,\n \"title\": \"Apple Loop: iPhone 16 Pro Expectations, iPhone Air Details, Apple Watch SE Leaks\",\n \"source\": {\n \"name\": \"Forbes\",\n \"icon\": \"https://lh3.googleusercontent.com/NIjzR9QHtZJllEvJIVkODXFQ7_rbx1BMBXx2rNUbttjuu9YWLIp2_juQaI9jJ2rDtzi6snbZ\",\n \"authors\": [\n \"Ewan Spence\"\n ]\n },\n \"link\": \"https://www.forbes.com/sites/ewanspence/2024/08/16/apple-news-headlines-iphone-16-pro-iphone-air-epic-app-store/\",\n \"thumbnail\": \"https://imageio.forbes.com/specials-images/imageserve/6622e32e24ecc74de9e50e06/Apple-Unveils-iPhone-15-And-Other-New-Products/960x0.jpg?height=473&width=711&fit=bounds\",\n \"date\": \"08/16/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 21,\n \"title\": \"Apple 'Glowtime' event sees iPhone 16, iPhone 16 Pro, Apple Watch unveilings: Recap\",\n \"source\": {\n \"name\": \"USA TODAY\",\n \"icon\": \"https://lh3.googleusercontent.com/-azIrtjYWp_uW0mZr2EgCuDyyZ9WpFOIWNx3qM1wwCzV37NgmqATpNZGn9R0y8XklFku6Hhwz6w\",\n \"authors\": [\n \"James C. Powel\",\n \"Jonathan Limehouse\",\n \"Felecia Wellington Radel\"\n ]\n },\n \"link\": \"https://www.usatoday.com/story/tech/news/2024/09/09/apple-event-2024-live-updates-iphone-watch-airpod/75104890007/\",\n \"thumbnail\": \"https://www.usatoday.com/gcdn/authoring/authoring-images/2024/09/04/USAT/75072775007-apple-glowtime-event.png?crop=1004,564,x14,y0&width=660&height=371&format=pjpg&auto=webp\",\n \"date\": \"09/09/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 22,\n \"title\": \"Apple Loop: iPhone 16 Pro Release Date, Apple Intelligence Delay, iPhone Air Leaks\",\n \"source\": {\n \"name\": \"Forbes\",\n \"icon\": \"https://lh3.googleusercontent.com/NIjzR9QHtZJllEvJIVkODXFQ7_rbx1BMBXx2rNUbttjuu9YWLIp2_juQaI9jJ2rDtzi6snbZ\",\n \"authors\": [\n \"Ewan Spence\"\n ]\n },\n \"link\": \"https://www.forbes.com/sites/ewanspence/2024/08/09/apple-news-headlines-iphone-16-pro-release-date-iphone-air-macbook-pro-m4/\",\n \"thumbnail\": \"https://imageio.forbes.com/specials-images/imageserve/66b66f2ee8af9409d28bb6db/Apple-iPhone-15-And-Apple-Watch-Series-9-Launches-In-Australia/960x0.jpg?height=474&width=711&fit=bounds\",\n \"date\": \"08/10/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 23,\n \"title\": \"Where is Apple headed after latest product event? Experts weigh in.\",\n \"source\": {\n \"name\": \"ABC News\",\n \"icon\": \"https://lh3.googleusercontent.com/X8gOYJVMpwt5Rdxa-TEs1Av4_oZNCCtQN-1abkvvfNdvy3JvVhT1mERLPhFXBI6xsCV4K_lQpJI\",\n \"authors\": [\n \"Max Zahn\"\n ]\n },\n \"link\": \"https://abcnews.go.com/Business/apple-headed-after-latest-product-event-experts-weigh/story?id=109987688\",\n \"thumbnail\": \"https://s.abcnews.com/images/Business/apple-1-gty-er-240507_1715102279684_hpMain_16x9_1600.jpg\",\n \"date\": \"05/07/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 24,\n \"title\": \"Apple stock might soar thanks to old iPhones\",\n \"source\": {\n \"name\": \"Fortune\",\n \"icon\": \"https://lh3.googleusercontent.com/tFLb6M9by7fEPdctsE-5e-YDl6ecYOdDGEYTTC5krR3yydg4uRHaSorz2f0hHNyMWSHq20XBMw\",\n \"authors\": [\n \"William Daniel\"\n ]\n },\n \"link\": \"https://fortune.com/2024/07/12/most-iphone-users-have-old-phones-good-news-for-apple-stock/\",\n \"thumbnail\": \"https://fortune.com/img-assets/wp-content/uploads/2024/07/GettyImages-2157035756-e1720805976209.jpg?w=1440&q=75\",\n \"date\": \"07/12/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 25,\n \"title\": \"The latest news, headlines, and business stories for January 9\",\n \"source\": {\n \"name\": \"Business Insider\",\n \"icon\": \"https://lh3.googleusercontent.com/MD0yHuvt1mX8YyHUcdTCsQqMKGubFCwbWmpxzkT1xnE5wZ4aDRmb2zvkgfgG_b0mHNhaSxqO2A\",\n \"authors\": [\n \"Dan DeFrancesco\"\n ]\n },\n \"link\": \"https://www.businessinsider.com/news-today-january-9-apple-vision-pro-2024-1\",\n \"thumbnail\": \"https://i.insider.com/659d7ba3dcdb354a9855ef06?width=1136&format=jpeg\",\n \"date\": \"01/09/2024, 08:00 AM, +0000 UTC\"\n },\n {\n \"position\": 26,\n \"title\": \"Apple iPhone sales plunge, as shares rise on dividend, stock buyback news\",\n \"source\": {\n \"name\": \"Al Jazeera English\",\n \"icon\": \"https://lh3.googleusercontent.com/l-Ps9rkWuApN8G3MB5uZC_a5G7iKCTITjMdpZFhm2rQf3U2M2Yr_KTYpzpmOPxDiUKgb9yN9ha8\"\n },\n \"link\": \"https://www.aljazeera.com/economy/2024/5/3/apple-iphone-sales-plunge-as-shares-rise-on-dividend-stock-buyback-news\",\n \"thumbnail\": \"https://www.aljazeera.com/wp-content/uploads/2024/05/AP24116703740413-1714696029.jpg?resize=770%2C513&quality=80\",\n \"date\": \"05/03/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 27,\n \"title\": \"Apple leaps into AI with an array of upcoming iPhone features and a ChatGPT deal to smarten up\",\n \"source\": {\n \"name\": \"The Associated Press\",\n \"icon\": \"https://lh3.googleusercontent.com/M087pJgRw3PLf4gl-Y7U-tJn6uaN99AUbFIuX7fmMnhq5QeNylJQMq_UeYPPVaEPk-5jL9I3QA\",\n \"authors\": [\n \"Michael Liedtke\"\n ]\n },\n \"link\": \"https://apnews.com/article/apple-artificial-intelligence-siri-iphone-software-conference-4217d67977f95ead880835a71ecce098\",\n \"thumbnail\": \"https://dims.apnews.com/dims4/default/62f02a8/2147483647/strip/true/crop/5074x3383+0+0/resize/599x399!/quality/90/?url=https%3A%2F%2Fassets.apnews.com%2Fd3%2Fa2%2F94c981c15091dd9b14acc4c09dbd%2Fa8e81e844947478d9bee864d6b8d9ff5\",\n \"date\": \"06/10/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 28,\n \"title\": \"Apple introduces AI to its products at WWDC\",\n \"source\": {\n \"name\": \"CNN\",\n \"icon\": \"https://lh3.googleusercontent.com/8zdvTbISHUn-4iHkauW-_yQSGPD9BMrx9EWfqTIhiVm2YMYqhHC1HJWNDQoSOkMk0MRPYKxjIg\",\n \"authors\": [\n \"Brian Fung\",\n \"Michael Ballaban\",\n \"Aditi Sangal\"\n ]\n },\n \"link\": \"https://www.cnn.com/business/live-news/apple-wwdc-keynote-06-10-24/index.html\",\n \"thumbnail\": \"https://media.cnn.com/api/v1/images/stellar/prod/240305171738-exp-apple-iphone-china-duffy-live-030503pseg2-cnni-business-00003501.png?c=16x9&q=w_1280,c_fill\",\n \"date\": \"06/10/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 29,\n \"title\": \"US v. Apple: everything you need to know\",\n \"source\": {\n \"name\": \"The Verge\",\n \"icon\": \"https://lh3.googleusercontent.com/vkRH5gyHtLcKAoRSFHK1ATEgKtHDXoi9iRKKOdVhOng8g7qF2_QCVT1f11q_y_4y95_PY5VzWQ\"\n },\n \"link\": \"https://www.theverge.com/24107581/doj-v-apple-antitrust-monoply-news-updates\",\n \"thumbnail\": \"https://i.ytimg.com/vi/MI1TlBfPjQs/maxresdefault.jpg\",\n \"date\": \"08/01/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 30,\n \"title\": \"How Microsoft and Nvidia bet correctly to leapfrog Apple\",\n \"source\": {\n \"name\": \"BBC.com\",\n \"icon\": \"https://lh3.googleusercontent.com/_XS8V0jvDj-pe4NDxsc_8_YEk38hNH30ocGDk7oEwtRZNw-kUUuQouAYLFO0uIPFLX05QCKyoSo\",\n \"authors\": [\n \"Zoe Kleinman\"\n ]\n },\n \"link\": \"https://www.bbc.com/news/articles/c4nglq80w7eo\",\n \"thumbnail\": \"https://ichef.bbci.co.uk/news/1024/branded_news/4074/live/45927c90-3789-11ef-9bca-0db727f63d54.jpg\",\n \"date\": \"07/02/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 31,\n \"title\": \"Apple\u2019s RCS Update Confirms Critical Missing Features On Launch\",\n \"source\": {\n \"name\": \"Forbes\",\n \"icon\": \"https://lh3.googleusercontent.com/NIjzR9QHtZJllEvJIVkODXFQ7_rbx1BMBXx2rNUbttjuu9YWLIp2_juQaI9jJ2rDtzi6snbZ\",\n \"authors\": [\n \"Zak Doffman\"\n ]\n },\n \"link\": \"https://www.forbes.com/sites/zakdoffman/2024/09/19/apples-ios-18-update-new-warning-for-millions-of-iphone-15-iphone-16-users/\",\n \"thumbnail\": \"https://imageio.forbes.com/specials-images/imageserve/65744e9437fe0bbac67751bf/Pictured--iMessage-menu-screenshot/0x0.jpg?format=jpg&crop=2007,1116,x366,y602,safe&width=960\",\n \"date\": \"09/19/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 32,\n \"title\": \"Warren Buffett surprises by slashing Berkshire Hathaway's longtime Apple stake in second quarter\",\n \"source\": {\n \"name\": \"The Associated Press\",\n \"icon\": \"https://lh3.googleusercontent.com/M087pJgRw3PLf4gl-Y7U-tJn6uaN99AUbFIuX7fmMnhq5QeNylJQMq_UeYPPVaEPk-5jL9I3QA\",\n \"authors\": [\n \"Josh Funk\"\n ]\n },\n \"link\": \"https://apnews.com/article/warren-buffett-berkshire-hathaway-profit-earnings-7af22b7ad654ba012d8e8803ed694aea\",\n \"thumbnail\": \"https://dims.apnews.com/dims4/default/1d5c533/2147483647/strip/true/crop/7722x5227+0+0/resize/599x405!/quality/90/?url=https%3A%2F%2Fassets.apnews.com%2F75%2F8b%2Fa4bac8e23f215d62877fcf4e7775%2F565ec4c244934dc8b65d20253d8dfbf2\",\n \"date\": \"08/03/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 33,\n \"title\": \"Is Apple Stock A Buy Or Sell In Early August 2024?\",\n \"source\": {\n \"name\": \"Investor's Business Daily\",\n \"icon\": \"https://lh3.googleusercontent.com/-m-56Z1d9ObiT3mixbg-CNUkjN8m9UWzzzJ6mm8jJULcnWYyxz5IBCYuZ5cQXy6MQceme7nYRQ\"\n },\n \"link\": \"https://www.investors.com/research/apple-stock-buy-now/\",\n \"thumbnail\": \"https://www.investors.com/wp-content/uploads/2018/06/stock-apple-35-ahutter-640x360.jpg\",\n \"date\": \"08/05/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 34,\n \"title\": \"Apple iPhone 16 Pro: New Design Echoed In Latest Leak\",\n \"source\": {\n \"name\": \"Forbes\",\n \"icon\": \"https://lh3.googleusercontent.com/NIjzR9QHtZJllEvJIVkODXFQ7_rbx1BMBXx2rNUbttjuu9YWLIp2_juQaI9jJ2rDtzi6snbZ\",\n \"authors\": [\n \"David Phelan\"\n ]\n },\n \"link\": \"https://www.forbes.com/sites/davidphelan/2024/08/24/apple-iphone-16-pro-new-design-echoed-in-latest-leak/\",\n \"thumbnail\": \"https://imageio.forbes.com/specials-images/imageserve/666440c4ace3cc022c2833b6/UK-Daily-Life-2024/960x0.jpg?height=472&width=711&fit=bounds\",\n \"date\": \"08/24/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 35,\n \"title\": \"Apple\u2019s first quarter has felt more like an entire (bad) year\",\n \"source\": {\n \"name\": \"Yahoo Finance\",\n \"icon\": \"https://lh3.googleusercontent.com/L57n4HUzUS8lNXBPYNGQScsyxaqqx42Nym3-tUk8NzkTvMsa95NhzEqC8KMqVPFpAFpCuPFdlA\",\n \"authors\": [\n \"Daniel Howley\"\n ]\n },\n \"link\": \"https://finance.yahoo.com/news/apples-first-quarter-has-felt-more-like-an-entire-bad-year-201715880.html\",\n \"date\": \"03/31/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 36,\n \"title\": \"News updates from July 2: Biden to meet with Democratic governors; Apple to join OpenAI\u2019s board in observer role\",\n \"source\": {\n \"name\": \"Financial Times\",\n \"icon\": \"https://lh3.googleusercontent.com/281oPpXmEcGU9cV4N2LudyLEG2aBqbqG2iDoMoXUXKl-SWD4AUdO5652KVTGNmcduSWZB_7j\"\n },\n \"link\": \"https://www.ft.com/content/17cc7092-f653-4a74-b69e-b8d9a7d4c8bf\",\n \"thumbnail\": \"https://www.ft.com/__origami/service/image/v2/images/raw/https%3A%2F%2Fwww.ft.com%2F__origami%2Fservice%2Fimage%2Fv2%2Fimages%2Fraw%2Fhttps%253A%252F%252Fd1e00ek4ebabms.cloudfront.net%252Fproduction%252F6b591a33-a50e-4b56-becb-73c91efa51f3.jpg%3Fsource%3Dnext-article%26fit%3Dscale-down%26quality%3Dhighest%26width%3D700%26dpr%3D1?source=next&fit=scale-down&dpr=2&width=240\",\n \"date\": \"07/02/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 37,\n \"title\": \"US sues Apple in antitrust lawsuit: Live updates\",\n \"source\": {\n \"name\": \"CNN\",\n \"icon\": \"https://lh3.googleusercontent.com/8zdvTbISHUn-4iHkauW-_yQSGPD9BMrx9EWfqTIhiVm2YMYqhHC1HJWNDQoSOkMk0MRPYKxjIg\",\n \"authors\": [\n \"Matt Meyer\",\n \"Brian Fung\",\n \"Antoinette Radford\"\n ]\n },\n \"link\": \"https://www.cnn.com/business/live-news/doj-apple-antitrust-lawsuit-03-21-24/index.html\",\n \"thumbnail\": \"https://media.cnn.com/api/v1/images/stellar/prod/240321113841-garland-vpx.jpg?c=16x9&q=w_1280,c_fill\",\n \"date\": \"03/21/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 38,\n \"title\": \"Apple lawsuit: US accuses tech giant of monopolising smartphone market\",\n \"source\": {\n \"name\": \"BBC.com\",\n \"icon\": \"https://lh3.googleusercontent.com/_XS8V0jvDj-pe4NDxsc_8_YEk38hNH30ocGDk7oEwtRZNw-kUUuQouAYLFO0uIPFLX05QCKyoSo\",\n \"authors\": [\n \"Natalie Sherman\",\n \"Bernd Debusmann Jr.\",\n \"Bernd Debusmann\"\n ]\n },\n \"link\": \"https://www.bbc.com/news/world-us-canada-68628989\",\n \"date\": \"03/21/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 39,\n \"title\": \"Justice Department sues Apple, alleging it illegally monopolized the smartphone market\",\n \"source\": {\n \"name\": \"The Associated Press\",\n \"icon\": \"https://lh3.googleusercontent.com/M087pJgRw3PLf4gl-Y7U-tJn6uaN99AUbFIuX7fmMnhq5QeNylJQMq_UeYPPVaEPk-5jL9I3QA\",\n \"authors\": [\n \"Michael Liedtke\",\n \"Lindsay Whitehurst\",\n \"Mike Balsamo\"\n ]\n },\n \"link\": \"https://apnews.com/article/apple-antitrust-monopoly-app-store-justice-department-822d7e8f5cf53a2636795fcc33ee1fc3\",\n \"thumbnail\": \"https://dims.apnews.com/dims4/default/bf96ead/2147483647/strip/true/crop/7165x4777+0+0/resize/599x399!/quality/90/?url=https%3A%2F%2Fassets.apnews.com%2F56%2F53%2F579ce3eb65fa4639868218939002%2Fb596a087b8d2400d8150280062fa5341\",\n \"date\": \"03/21/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 40,\n \"title\": \"Apple iPad event: all the news from Apple\u2019s \u201cLet Loose\u201d reveal\",\n \"source\": {\n \"name\": \"The Verge\",\n \"icon\": \"https://lh3.googleusercontent.com/vkRH5gyHtLcKAoRSFHK1ATEgKtHDXoi9iRKKOdVhOng8g7qF2_QCVT1f11q_y_4y95_PY5VzWQ\",\n \"authors\": [\n \"Wes Davis\"\n ]\n },\n \"link\": \"https://www.theverge.com/2024/5/7/24150047/apple-ipad-let-loose-event-news-announcements\",\n \"thumbnail\": \"https://i.ytimg.com/vi/bMdhx5ijGN8/maxresdefault.jpg\",\n \"date\": \"05/14/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 41,\n \"title\": \"Stock market today: S&P 500, Nasdaq notch fresh records with Apple as CPI, Fed decision loom\",\n \"source\": {\n \"name\": \"Yahoo Finance\",\n \"icon\": \"https://lh3.googleusercontent.com/L57n4HUzUS8lNXBPYNGQScsyxaqqx42Nym3-tUk8NzkTvMsa95NhzEqC8KMqVPFpAFpCuPFdlA\",\n \"authors\": [\n \"Karen Friar\"\n ]\n },\n \"link\": \"https://finance.yahoo.com/news/live/stock-market-today-sp-500-nasdaq-notch-fresh-records-with-apple-as-cpi-fed-decision-loom-200037315.html\",\n \"date\": \"06/11/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 42,\n \"title\": \"Stock Market News, May 2, 2024: Nasdaq Closes Higher; Apple Delivers Latest Earnings\",\n \"source\": {\n \"name\": \"The Wall Street Journal\",\n \"icon\": \"https://lh3.googleusercontent.com/-Wo0rkJtT8uQ7BFow-YiRKzVlJNka-TbZM6_e2l3XQwNNqfPe1mR8Rc4_o_qAOJFb32YwQ4I1NM\",\n \"authors\": [\n \"George Stahl\",\n \"David Marino\",\n \"Caitlin McCabe\"\n ]\n },\n \"link\": \"https://www.wsj.com/livecoverage/stock-market-today-earnings-05-02-2024\",\n \"date\": \"05/02/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 43,\n \"title\": \"\u2018It\u2019s Glowtime\u2019: all the news from Apple\u2019s iPhone 16 event\",\n \"source\": {\n \"name\": \"The Verge\",\n \"icon\": \"https://lh3.googleusercontent.com/vkRH5gyHtLcKAoRSFHK1ATEgKtHDXoi9iRKKOdVhOng8g7qF2_QCVT1f11q_y_4y95_PY5VzWQ\",\n \"authors\": [\n \"Alex Cranz\"\n ]\n },\n \"link\": \"https://www.theverge.com/2024/9/9/24237601/apple-iphone-16-event-announcements-products\",\n \"thumbnail\": \"https://i.ytimg.com/vi/dIJVwG4Glg8/maxresdefault.jpg\",\n \"date\": \"09/14/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 44,\n \"title\": \"Apple\u2019s iOS 18 brings major updates to CarPlay\",\n \"source\": {\n \"name\": \"CBT Automotive News\",\n \"icon\": \"https://lh3.googleusercontent.com/jelVjSP3PH3qJkCne7S-0E6p712_wSb7OyJRCXBmAP0D1mE_mIsmvGeK7lFdLBa1HS7uLJwAXek\"\n },\n \"link\": \"https://www.cbtnews.com/apples-ios-18-brings-major-updates-to-carplay/\",\n \"thumbnail\": \"https://d9s1543upwp3n.cloudfront.net/wp-content/uploads/2021/11/carplay.jpeg.optimal-324x160.jpeg\",\n \"date\": \"09/18/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 45,\n \"title\": \"Apple sued in a landmark iPhone monopoly lawsuit\",\n \"source\": {\n \"name\": \"CNN\",\n \"icon\": \"https://lh3.googleusercontent.com/8zdvTbISHUn-4iHkauW-_yQSGPD9BMrx9EWfqTIhiVm2YMYqhHC1HJWNDQoSOkMk0MRPYKxjIg\",\n \"authors\": [\n \"Evan Perez\",\n \"Hannah Rabinowitz\",\n \"Brian Fung\"\n ]\n },\n \"link\": \"https://www.cnn.com/2024/03/21/tech/apple-sued-antitrust-doj/index.html\",\n \"thumbnail\": \"https://media.cnn.com/api/v1/images/stellar/prod/gettyimages-1886193962-20240321113604017.jpg?c=16x9&q=h_833,w_1480,c_fill\",\n \"date\": \"03/21/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 46,\n \"title\": \"Warren Buffett Declares Shift: Selling Apple Stock To Invest In This 'Magnificent' Megacap \u2013 Here's Why\",\n \"source\": {\n \"name\": \"Yahoo Finance\",\n \"icon\": \"https://lh3.googleusercontent.com/L57n4HUzUS8lNXBPYNGQScsyxaqqx42Nym3-tUk8NzkTvMsa95NhzEqC8KMqVPFpAFpCuPFdlA\",\n \"authors\": [\n \"Latoya Scott\"\n ]\n },\n \"link\": \"https://finance.yahoo.com/news/warren-buffett-declares-shift-selling-144519364.html\",\n \"date\": \"08/12/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 47,\n \"title\": \"Apple launches Journal app, a new app for reflecting on everyday moments\",\n \"source\": {\n \"name\": \"Apple\",\n \"icon\": \"https://encrypted-tbn2.gstatic.com/faviconV2?url=https://www.apple.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\"\n },\n \"link\": \"https://www.apple.com/newsroom/2023/12/apple-launches-journal-app-a-new-app-for-reflecting-on-everyday-moments/\",\n \"thumbnail\": \"https://www.apple.com/newsroom/images/2023/12/apple-launches-journal-app-for-reflecting-on-everyday-moments/article/Apple-Journal-app-2-up_big.jpg.large.jpg\",\n \"date\": \"12/11/2023, 08:00 AM, +0000 UTC\"\n },\n {\n \"position\": 48,\n \"title\": \"Assessing Apple\u2019s Potential Can AAPL Reach $250 Before Q3\",\n \"source\": {\n \"name\": \"FinancialNews.co.uk\",\n \"icon\": \"https://encrypted-tbn1.gstatic.com/faviconV2?url=https://www.financial-news.co.uk&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\",\n \"authors\": [\n \"Sam Allcock\"\n ]\n },\n \"link\": \"https://www.financial-news.co.uk/assessing-apples-potential-can-aapl-reach-250-before-q3/\",\n \"thumbnail\": \"https://www.financial-news.co.uk/wp-content/uploads/2024/10/Assessing-Apple-s-Potential-Can-AAPL-Reach-250-Before-Q3.jpeg\",\n \"date\": \"10/22/2024, 04:25 PM, +0000 UTC\"\n },\n {\n \"position\": 49,\n \"title\": \"Stock Market News for Monday, May 6, 2024: Dow Edges Higher\",\n \"source\": {\n \"name\": \"Barron's\",\n \"icon\": \"https://lh3.googleusercontent.com/m-X2HbycVv69bHaPPRLUQqHewFp6sKnZimopA8xL-eSV3xctI-mCZIEJex6XBinCC54ucwYS\"\n },\n \"link\": \"https://www.barrons.com/livecoverage/stock-market-today-050624\",\n \"date\": \"05/06/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 50,\n \"title\": \"Weekly Student News Quiz: Israel-Hamas War, Medical Breakthrough, Apple\",\n \"source\": {\n \"name\": \"The New York Times\",\n \"icon\": \"https://lh3.googleusercontent.com/tDFSwtr61ZReDD_jw6kEPWegHMSqGEHx-ZS_t-e10We-GfWEPVYkn0uLk_Vn8XQHg8wcnhMWmug\"\n },\n \"link\": \"https://www.nytimes.com/interactive/2024/03/26/learning/26StudentNewsQuiz.html\",\n \"thumbnail\": \"https://static01.nyt.com/images/2024/03/25/multimedia/SecurityCouncilVoteLN-gmjk/SecurityCouncilVoteLN-gmjk-master315.jpg\",\n \"date\": \"03/26/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 51,\n \"title\": \"Grab Them. Then Stump Them.\",\n \"source\": {\n \"name\": \"The New York Times\",\n \"icon\": \"https://lh3.googleusercontent.com/tDFSwtr61ZReDD_jw6kEPWegHMSqGEHx-ZS_t-e10We-GfWEPVYkn0uLk_Vn8XQHg8wcnhMWmug\",\n \"authors\": [\n \"Mike Isaac\"\n ]\n },\n \"link\": \"https://www.nytimes.com/2024/06/11/technology/news-tech-sites-games.html\",\n \"thumbnail\": \"https://static01.nyt.com/images/2024/06/14/business/00tech-games-3x2/00tech-games-square640.jpg\",\n \"date\": \"06/17/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 52,\n \"title\": \"Spot The Difference: The Subtle Changes To Apple's Latest iPhone Line-Up\",\n \"source\": {\n \"name\": \"NDTV\",\n \"icon\": \"https://lh3.googleusercontent.com/tdxgqIuMCdYXjnxBEi-22G1al2_n0slQR4vppoxUyB3fupq2sPqxL3okZNKW_QWJrymCWx6k_g\",\n \"authors\": [\n \"Edward Ludlow\",\n \"Ed Ludlow\"\n ]\n },\n \"link\": \"https://www.ndtv.com/world-news/spot-the-difference-the-subtle-changes-to-apples-latest-iphone-line-up-6530805\",\n \"thumbnail\": \"https://c.ndtvimg.com/2024-09/lnc5g2i_apple-iphone_625x300_10_September_24.jpeg\",\n \"date\": \"09/10/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 53,\n \"title\": \"Apple ends yearlong sales slump with slight revenue rise in holiday-season period but stock slips\",\n \"source\": {\n \"name\": \"The Associated Press\",\n \"icon\": \"https://lh3.googleusercontent.com/M087pJgRw3PLf4gl-Y7U-tJn6uaN99AUbFIuX7fmMnhq5QeNylJQMq_UeYPPVaEPk-5jL9I3QA\",\n \"authors\": [\n \"Michael Liedtke\"\n ]\n },\n \"link\": \"https://apnews.com/article/apple-earnings-quarter-iphone-stock-6cd106723879cc1dea891d81e257fbc8\",\n \"thumbnail\": \"https://dims.apnews.com/dims4/default/d377ab8/2147483647/strip/true/crop/3602x2401+0+0/resize/599x399!/quality/90/?url=https%3A%2F%2Fassets.apnews.com%2F2e%2F7f%2F64dbb35fdf8ed25eea6349ab2be0%2Ff8264a2d29d840819909419d9e2eb5db\",\n \"date\": \"02/01/2024, 08:00 AM, +0000 UTC\"\n },\n {\n \"position\": 54,\n \"title\": \"Apple App Store Chief Phil Schiller Is the Latest Big Tech Exec to Join OpenAI\u2019s Board\",\n \"source\": {\n \"name\": \"Observer\",\n \"icon\": \"https://lh3.googleusercontent.com/3lX4VZI87uWsEdj-ihdfYCJfHJBA_IlXljPfu2_ey4mjaozSvFUGFgPuVLQdlZTXj6BC5xaH\",\n \"authors\": [\n \"Alexandra Tremayne-Pengelly\"\n ]\n },\n \"link\": \"https://observer.com/2024/07/apple-phil-schiller-nonvoting-board-seat-openai/\",\n \"thumbnail\": \"https://observer.com/wp-content/uploads/sites/2/2024/07/GettyImages-1173663853.jpg?quality=80&w=970\",\n \"date\": \"07/03/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 55,\n \"title\": \"Apple 'Glowtime' event latest news \u2014 iPhone 16, Apple Watch 10, AirPods 4 and more\",\n \"source\": {\n \"name\": \"Tom's Guide\",\n \"icon\": \"https://lh3.googleusercontent.com/YwroNBJq4UKY_6hH7n50b5Fnc3YEroWUN9CgsQG7p4WAvyJpTsXRG6taE0Te0iJafGqtei-zG_E\",\n \"authors\": [\n \"Mark Spoonauer\",\n \"Philip Michaels\"\n ]\n },\n \"link\": \"https://www.tomsguide.com/phones/live/apple-glowtime-event-iphone-16\",\n \"thumbnail\": \"https://cdn.mos.cms.futurecdn.net/s2znttdiicQPAfCNSmVwcZ-320-80.jpg\",\n \"date\": \"09/12/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 56,\n \"title\": \"Apple Explores A.I. Deals With News Publishers\",\n \"source\": {\n \"name\": \"The New York Times\",\n \"icon\": \"https://lh3.googleusercontent.com/tDFSwtr61ZReDD_jw6kEPWegHMSqGEHx-ZS_t-e10We-GfWEPVYkn0uLk_Vn8XQHg8wcnhMWmug\",\n \"authors\": [\n \"Benjamin Mullin\",\n \"Tripp Mickle\"\n ]\n },\n \"link\": \"https://www.nytimes.com/2023/12/22/technology/apple-ai-news-publishers.html\",\n \"thumbnail\": \"https://static01.nyt.com/images/2023/12/22/multimedia/22APPLEAI-fhwk/22APPLEAI-fhwk-articleLarge.jpg?quality=75&auto=webp&disable=upscale\",\n \"date\": \"12/22/2023, 08:00 AM, +0000 UTC\"\n },\n {\n \"position\": 57,\n \"title\": \"Nvidia value hits $3tn, overtaking Apple\",\n \"source\": {\n \"name\": \"BBC.com\",\n \"icon\": \"https://lh3.googleusercontent.com/_XS8V0jvDj-pe4NDxsc_8_YEk38hNH30ocGDk7oEwtRZNw-kUUuQouAYLFO0uIPFLX05QCKyoSo\",\n \"authors\": [\n \"Natalie Sherman\"\n ]\n },\n \"link\": \"https://www.bbc.com/news/articles/c6ppqd3j621o\",\n \"thumbnail\": \"https://ichef.bbci.co.uk/news/1024/branded_news/fea4/live/415e2650-2380-11ef-bac3-438326d5ea25.jpg\",\n \"date\": \"06/05/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 58,\n \"title\": \"Apple News Widget Disappeared After Updating to iOS 17.4.1\",\n \"source\": {\n \"name\": \"The Mac Observer\",\n \"icon\": \"https://encrypted-tbn3.gstatic.com/faviconV2?url=https://www.macobserver.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\",\n \"authors\": [\n \"Danny Maiorca\"\n ]\n },\n \"link\": \"https://www.macobserver.com/iphone/apple-news-widget-disappeared-after-updating-to-ios-17-4-1/\",\n \"thumbnail\": \"https://www.macobserver.com/wp-content/uploads/2024/05/Apple-News-Widget-Disappeared-iOS-17.4.png\",\n \"date\": \"05/07/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 59,\n \"title\": \"Markets News, June 11, 2024: Apple Lifts Nasdaq, S&P 500 to Records; Dow Lags Ahead of CPI\",\n \"source\": {\n \"name\": \"Investopedia\",\n \"icon\": \"https://lh3.googleusercontent.com/0hYGbsOZWCCeqnb_p_iGTScksgVWK0ScH8qbaFrwqvUvwJFITE7jf-1HQZzWLuFOrEkDZuq8Aao\",\n \"authors\": [\n \"Nisha Gopalan\",\n \"Colin Laidley\"\n ]\n },\n \"link\": \"https://www.investopedia.com/dow-jones-today-06112024-8661364\",\n \"thumbnail\": \"https://www.investopedia.com/thmb/TNTsdR0xPn0lQae59esdG8FGZQw=/1500x0/filters:no_upscale():max_bytes(150000):strip_icc()/MarketBlogImage-final-6ac06c7b9250446a8e86c566b11e02e1.png\",\n \"date\": \"06/11/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 60,\n \"title\": \"iPhone 16 rumors: Everything we know, including release date, price, and more\",\n \"source\": {\n \"name\": \"Mashable\",\n \"icon\": \"https://lh3.googleusercontent.com/1u9P_MGTTeuasCGJhx6XwmWvLYJtP4-kQkbl0bIODWnRD5gWTQo3lXYP-jXL1dah51KY2ysa\",\n \"authors\": [\n \"Kimberly Gedeon\"\n ]\n },\n \"link\": \"https://mashable.com/article/iphone-16-rumors\",\n \"thumbnail\": \"https://helios-i.mashable.com/imagery/articles/05vjuq9JPoajn7319Fp37Tr/hero-image.fill.size_1248x702.v1715830916.jpg\",\n \"date\": \"09/07/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 61,\n \"title\": \"Apple Loop: iPhone 16 Design Leaks, New M4 MacBook Pro, Apple\u2019s Open-Source AI\",\n \"source\": {\n \"name\": \"Forbes\",\n \"icon\": \"https://lh3.googleusercontent.com/NIjzR9QHtZJllEvJIVkODXFQ7_rbx1BMBXx2rNUbttjuu9YWLIp2_juQaI9jJ2rDtzi6snbZ\",\n \"authors\": [\n \"Ewan Spence\"\n ]\n },\n \"link\": \"https://www.forbes.com/sites/ewanspence/2024/06/23/apple-news-headlines-iphone-16-macbook-pro-m4-apple-intelligence-open-source/\",\n \"thumbnail\": \"https://imageio.forbes.com/specials-images/imageserve/667617064cc1648d107f6ac7/Apple-WWDC23-Photo-Illustrations/960x0.jpg?height=473&width=711&fit=bounds\",\n \"date\": \"06/23/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 62,\n \"title\": \"Apple latest to make AI safety pledge\",\n \"source\": {\n \"name\": \"Mobile World Live\",\n \"icon\": \"https://encrypted-tbn0.gstatic.com/faviconV2?url=https://www.mobileworldlive.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\",\n \"authors\": [\n \"Hana Anandira\"\n ]\n },\n \"link\": \"https://www.mobileworldlive.com/apple/apple-latest-to-make-ai-safety-pledge/\",\n \"thumbnail\": \"https://assets.mobileworldlive.com/wp-content/uploads/2020/05/16120247/Apple-store-Chicago-US-Shutterstock_650.png\",\n \"date\": \"07/26/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 63,\n \"title\": \"Is Apple News Worth It in 2024? A Quick Review\",\n \"source\": {\n \"name\": \"The Mac Observer\",\n \"icon\": \"https://encrypted-tbn3.gstatic.com/faviconV2?url=https://www.macobserver.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\"\n },\n \"link\": \"https://www.macobserver.com/tips/deep-dive/apple-news-review/\",\n \"thumbnail\": \"https://www.macobserver.com/wp-content/uploads/2019/04/workfeatured-apple-news-text-logo.png\",\n \"date\": \"05/10/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 64,\n \"title\": \"Why Some of Apple\u2019s Biggest Fans Are Returning Their Vision Pros\",\n \"source\": {\n \"name\": \"Bloomberg\",\n \"icon\": \"https://lh3.googleusercontent.com/NGEszdY4BPKjXpMWL2fgAHQasyKjNgr-yPt6p2ELILT6x6SV6gjNxJgplAAFTRD6-UhwMebPlA\",\n \"authors\": [\n \"Mark Gurman\"\n ]\n },\n \"link\": \"https://www.bloomberg.com/news/newsletters/2024-02-18/apple-vision-pro-returning-3-500-device-over-comfort-lack-of-apps-and-price-lsrk88mq\",\n \"thumbnail\": \"https://assets.bwbx.io/images/users/iqjWHBFdfxIU/ioLp503X.ArA/v1/-1x-1.webp\",\n \"date\": \"02/18/2024, 08:00 AM, +0000 UTC\"\n },\n {\n \"position\": 65,\n \"title\": \"Apple in 2023: The Biggest News Stories and Surprises of the Year\",\n \"source\": {\n \"name\": \"MacRumors\",\n \"icon\": \"https://lh3.googleusercontent.com/3SBMAEqsqmKgiDfi4ZLKs_-e-bKbdb5T-EPgbxAFN1kr6_qPClz_Nd2RP3ja9ZqITXLDV58QzQ\",\n \"authors\": [\n \"Joe Rossignol\"\n ]\n },\n \"link\": \"https://www.macrumors.com/2023/12/27/the-biggest-apple-news-stories-of-2023/\",\n \"thumbnail\": \"https://images.macrumors.com/t/VWKIc80WQRkMG04WBMuhIoiSQNo=/1600x0/article-new/2023/12/Apple-in-2023-Feature.jpg\",\n \"date\": \"12/27/2023, 08:00 AM, +0000 UTC\"\n },\n {\n \"position\": 66,\n \"title\": \"Apple Stock: Legal Challenges and Uncertainty\",\n \"source\": {\n \"name\": \"TheStreet\",\n \"icon\": \"https://lh3.googleusercontent.com/br72SINUoS0KcWDp4e1QbcEo6wWuiQQCIR5KG8afEMNNBOCnFgs4V5muKBPImGHqzy3JMNAT\",\n \"authors\": [\n \"Kenio Fontes\"\n ]\n },\n \"link\": \"https://www.thestreet.com/apple/news/apple-stock-legal-challenges-and-uncertainty\",\n \"thumbnail\": \"https://www.thestreet.com/.image/ar_4:3%2Cc_fill%2Ccs_srgb%2Cfl_progressive%2Cq_auto:good%2Cw_1200/MTk1MjI0Mjk5NTEzMDYyNTk5/210128_timcook_privacy_applepark_bk136122.jpg\",\n \"date\": \"03/25/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 67,\n \"title\": \"U.S. hits Apple with landmark antitrust suit, accusing tech giant of stifling competition\",\n \"source\": {\n \"name\": \"CBS News\",\n \"icon\": \"https://lh3.googleusercontent.com/dXy0k7AMf-wXfnj2AtaLk3rZcPGjClkFvKSAQnjoLp9wa_ggxST_WSGqovh984zY8mf3vDmt\",\n \"authors\": [\n \"Robert Legare\"\n ]\n },\n \"link\": \"https://www.cbsnews.com/news/apple-antitrust-lawsuit-justice-department-iphone-apple-watch-imessage/\",\n \"thumbnail\": \"https://assets1.cbsnewsstatic.com/hub/i/r/2024/03/21/5bc2a11b-65ab-4dbe-836a-6b315e87e713/thumbnail/1200x630/a69f4ebbbad84c11eb2067c1b1c53ab4/gettyimages-2101984965.jpg?v=b241b87adbbb7f0a227ed35b96d0cefa\",\n \"date\": \"03/22/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 68,\n \"title\": \"News updates from May 2: Apple\u2019s revenue hit by falling China sales; Gazprom plunges to $7bn loss\",\n \"source\": {\n \"name\": \"Financial Times\",\n \"icon\": \"https://lh3.googleusercontent.com/281oPpXmEcGU9cV4N2LudyLEG2aBqbqG2iDoMoXUXKl-SWD4AUdO5652KVTGNmcduSWZB_7j\"\n },\n \"link\": \"https://www.ft.com/content/c2973eac-16c3-47b3-9e45-64d5da0e7e8a\",\n \"thumbnail\": \"https://www.ft.com/__origami/service/image/v2/images/raw/https%3A%2F%2Fd1e00ek4ebabms.cloudfront.net%2Fproduction%2Ff593a1f8-c0a7-48da-bb11-4a412d650db6.jpg?source=next-article&fit=scale-down&quality=highest&width=700&dpr=1\",\n \"date\": \"05/02/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 69,\n \"title\": \"Apple apologizes for latest-edition iPad 'Crush' ad on X after backlash\",\n \"source\": {\n \"name\": \"FRANCE 24 English\",\n \"icon\": \"https://encrypted-tbn2.gstatic.com/faviconV2?url=https://www.france24.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\"\n },\n \"link\": \"https://www.france24.com/en/live-news/20240509-apple-apologizes-for-ipad-crush-ad-after-backlash\",\n \"thumbnail\": \"https://s.france24.com/media/display/130a4fd6-0e4f-11ef-9a6e-005056a97e36/w:480/p:16x9/Part-GTY-1445281667-1-1-0.jpg\",\n \"date\": \"05/09/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 70,\n \"title\": \"Apple becomes first target of EU\u2019s new digital competition rules aimed at big tech\",\n \"source\": {\n \"name\": \"The Associated Press\",\n \"icon\": \"https://lh3.googleusercontent.com/M087pJgRw3PLf4gl-Y7U-tJn6uaN99AUbFIuX7fmMnhq5QeNylJQMq_UeYPPVaEPk-5jL9I3QA\",\n \"authors\": [\n \"Kelvin Chan\"\n ]\n },\n \"link\": \"https://apnews.com/article/apple-european-union-digital-regulation-rules-app-store-07c34a80a5c98d0014e1c669a86af6a4\",\n \"thumbnail\": \"https://dims.apnews.com/dims4/default/047021b/2147483647/strip/true/crop/2925x1947+0+2/resize/320x213!/quality/90/?url=https%3A%2F%2Fassets.apnews.com%2F0f%2F84%2Ff0208396f15211385a3c3cdc5dd3%2F1110cfb43bd84e2cbd0abd3c58ca5f94\",\n \"date\": \"06/24/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 71,\n \"title\": \"Today's top business headlines: Microsoft's Russian hackers, Apple's AI plans, and social media's very bad week\",\n \"source\": {\n \"name\": \"Fast Company\",\n \"icon\": \"https://lh3.googleusercontent.com/-e7e5mZOqWu-vrXLumST-06HPO9lPxaw16x6Bq2Nr_2tYSdyrHeA5mX_NzSC4x-Z3cadlQBnuA\",\n \"authors\": [\n \"Grace Snelling\"\n ]\n },\n \"link\": \"https://www.fastcompany.com/91054230/todays-top-business-headlines-microsofts-russian-hackers-apples-ai-plans-and-social-medias-very-bad-week\",\n \"thumbnail\": \"https://images.fastcompany.com/image/upload/f_webp,q_auto,c_fit/wp-cms/uploads/2024/03/p-1-91054230-business-headlines-microsoft-russian-hackers-apple-ai-social-media-bad-week.jpg\",\n \"date\": \"03/11/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 72,\n \"title\": \"Mass IT outage hits global airports, businesses and broadcasters\",\n \"source\": {\n \"name\": \"NBC News\",\n \"icon\": \"https://lh3.googleusercontent.com/qQgvCbPniYSaGbEdmp0fsD9Te7E2jE7TTCuy1h6h71QDEMnN-xVVrPE5xN5k5a6MF0XkOaNN-w\",\n \"authors\": [\n \"Kevin Collier\",\n \"Patrick Smith\"\n ]\n },\n \"link\": \"https://www.nbcnews.com/news/us-news/mass-cyber-outage-airports-businesses-broadcasters-crowdstrike-rcna162664\",\n \"thumbnail\": \"https://media-cldnry.s-nbcnews.com/image/upload/rockcms/2024-07/240719-global-network-outage-mb-1043-7abacc.jpg\",\n \"date\": \"07/19/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 73,\n \"title\": \"TikTok, Apple News and Instagram should be included in news media bargaining code, Greens say\",\n \"source\": {\n \"name\": \"The Guardian\",\n \"icon\": \"https://lh3.googleusercontent.com/SU8FywVNtcrG-wgjvZ_0D1-3JR_pN9LNSgjULFH74N748KVyEdkF1jdbvP4Lr7_ClbPZxL-iPw\",\n \"authors\": [\n \"Josh Taylor\"\n ]\n },\n \"link\": \"https://www.theguardian.com/media/2024/mar/05/meta-facebook-news-australia-changes-greens-tiktok-apple-news-instagram-included\",\n \"date\": \"03/05/2024, 08:00 AM, +0000 UTC\"\n },\n {\n \"position\": 74,\n \"title\": \"Apple stops selling latest Apple Watch after losing patent case\",\n \"source\": {\n \"name\": \"NPR\",\n \"icon\": \"https://lh3.googleusercontent.com/n1J5BgiRjTv0UA7P7ow6a4W1NsYEz8yc-Cbr539Q-le21-0uoqwGOIItzyalR8JOHXxwAL7eng\",\n \"authors\": [\n \"Bobby Allyn\"\n ]\n },\n \"link\": \"https://www.npr.org/2023/12/18/1220125508/apple-watch-series-9-ultra-2-masimo-patent\",\n \"thumbnail\": \"https://media.npr.org/assets/img/2023/12/18/ap23352759169639_custom-0c3844de01a10a066bceab3d71c74a35c3e8de10.jpg?s=1100&c=85&f=jpeg\",\n \"date\": \"12/18/2023, 08:00 AM, +0000 UTC\"\n },\n {\n \"position\": 75,\n \"title\": \"News updates from August 26: Apple\u2019s CFO to step down; Oil hits 2-week high after Libya halts exports\",\n \"source\": {\n \"name\": \"Financial Times\",\n \"icon\": \"https://lh3.googleusercontent.com/281oPpXmEcGU9cV4N2LudyLEG2aBqbqG2iDoMoXUXKl-SWD4AUdO5652KVTGNmcduSWZB_7j\"\n },\n \"link\": \"https://www.ft.com/content/c663038f-af84-468d-851c-dbf633d08f57\",\n \"thumbnail\": \"https://www.ft.com/__origami/service/image/v2/images/raw/https%3A%2F%2Fwww.ft.com%2F__origami%2Fservice%2Fimage%2Fv2%2Fimages%2Fraw%2Fhttps%253A%252F%252Fd1e00ek4ebabms.cloudfront.net%252Fproduction%252Ff1f3299d-3295-49b7-8e0a-56d2bf90d881.jpg%3Fsource%3Dnext-article%26fit%3Dscale-down%26quality%3Dhighest%26width%3D700%26dpr%3D1?source=next-opengraph&fit=scale-down&width=900\",\n \"date\": \"08/26/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 76,\n \"title\": \"Our 8 Favorite News Apps for iPhone in 2024\",\n \"source\": {\n \"name\": \"Lifewire\",\n \"icon\": \"https://lh3.googleusercontent.com/AO0mkVbn7LYlaW8aa9yJBiY5OHrRtFFFt9o0SSVE-8NQIerDpAX1Aju4kGdJqAik1aw3zVbMdw\",\n \"authors\": [\n \"Brenna Marie Miles\"\n ]\n },\n \"link\": \"https://www.lifewire.com/best-news-apps-for-iphone-4707728\",\n \"thumbnail\": \"https://www.lifewire.com/thmb/XtuvH5L8oDwRl5se7uw6zLJZ-yk=/1500x0/filters:no_upscale():max_bytes(150000):strip_icc()/Apple-302171f9decd4539a553d65141040b2c.jpg\",\n \"date\": \"08/05/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 77,\n \"title\": \"Apple Glasses: Everything we've heard so far\",\n \"source\": {\n \"name\": \"Tom's Guide\",\n \"icon\": \"https://lh3.googleusercontent.com/YwroNBJq4UKY_6hH7n50b5Fnc3YEroWUN9CgsQG7p4WAvyJpTsXRG6taE0Te0iJafGqtei-zG_E\",\n \"authors\": [\n \"Kate Kozuch\",\n \"Roland Moore-Colyer\"\n ]\n },\n \"link\": \"https://www.tomsguide.com/news/apple-glasses\",\n \"thumbnail\": \"https://cdn.mos.cms.futurecdn.net/G9cxMFp4BXmPnuxJCxTAXV-320-80.jpeg\",\n \"date\": \"03/18/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 78,\n \"title\": \"Apple TV+ Is the Best Streamer Out There. So Why Is No One Watching?\",\n \"source\": {\n \"name\": \"Consequence\",\n \"icon\": \"https://lh3.googleusercontent.com/OLQ1dkGVXnklszXBGpSqHuW7yAetpOc-8ZPWc4WPTSAEYBW6duocXZ6-DAE2v0L8LKY8u-C5\",\n \"authors\": [\n \"Alex Young\"\n ]\n },\n \"link\": \"https://consequence.net/2024/03/apple-tv-best-streamer/\",\n \"thumbnail\": \"https://consequence.net/wp-content/uploads/2024/03/For-All-Mankind.jpeg\",\n \"date\": \"03/27/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 79,\n \"title\": \"US lifts ban on imports of latest Apple watch\",\n \"source\": {\n \"name\": \"BBC.com\",\n \"icon\": \"https://lh3.googleusercontent.com/_XS8V0jvDj-pe4NDxsc_8_YEk38hNH30ocGDk7oEwtRZNw-kUUuQouAYLFO0uIPFLX05QCKyoSo\",\n \"authors\": [\n \"Monica Miller\"\n ]\n },\n \"link\": \"https://www.bbc.com/news/business-67825553\",\n \"date\": \"12/27/2023, 08:00 AM, +0000 UTC\"\n },\n {\n \"position\": 80,\n \"title\": \"Apple\u2019s new Sports app offers scores, stats and interesting caveats\",\n \"source\": {\n \"name\": \"The Washington Post\",\n \"icon\": \"https://lh3.googleusercontent.com/o6yPxQMQu9ofTcfOYO51BWEv7jK44QjB14DqTK_cl1N3LsWVEF3GUHd1byHOQ3n8L6ySZluEhZQ\",\n \"authors\": [\n \"Chris Velazco\"\n ]\n },\n \"link\": \"https://www.washingtonpost.com/technology/2024/02/21/apple-sports-app-iphone/\",\n \"thumbnail\": \"https://www.washingtonpost.com/wp-apps/imrs.php?src=https://arc-anglerfish-washpost-prod-washpost.s3.amazonaws.com/public/DAWCBTI23HXDZRJ7ODESUAYPVE.jpg&w=1200\",\n \"date\": \"02/21/2024, 08:00 AM, +0000 UTC\"\n },\n {\n \"position\": 81,\n \"title\": \"Apple News+ Adds New York Times\u2019 The Athletic Sports Content\",\n \"source\": {\n \"name\": \"Sportico\",\n \"icon\": \"https://lh3.googleusercontent.com/HnEKPXskEwaTgt3GXpyQSNC-hWFN3_ZdHCZP_tg_0SwQ5Y9avKJycVYFpEeOJ10yd_DaxcZgnQ\",\n \"authors\": [\n \"Todd Spangler\"\n ]\n },\n \"link\": \"https://www.sportico.com/business/media/2023/apple-news-adds-new-york-times-athletic-sports-content-1234758849/\",\n \"thumbnail\": \"https://www.sportico.com/wp-content/uploads/2023/12/New-York-Times.webp\",\n \"date\": \"12/19/2023, 08:00 AM, +0000 UTC\"\n },\n {\n \"position\": 82,\n \"title\": \"Spotify: Apple has 'defied' the EU by blocking latest update with pricing info [U: Apple response]\",\n \"source\": {\n \"name\": \"9to5Mac\",\n \"icon\": \"https://lh3.googleusercontent.com/_yU7TVFBBY59lFTGF_gB-G6AZql5gRMNflxhEDwVjLtWfN6Xh6JPnPNqKAJO75h_BLghOkzYPw\",\n \"authors\": [\n \"Michael Potuck\"\n ]\n },\n \"link\": \"https://9to5mac.com/2024/04/25/spotify-says-apple-defies-eu-again/\",\n \"thumbnail\": \"https://9to5mac.com/wp-content/uploads/sites/6/2023/03/apple-music-vs-spotify.jpg?quality=82&strip=all&w=1600\",\n \"date\": \"04/25/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 83,\n \"title\": \"Apple Vision Pro debuts Friday. Here's what you need to know.\",\n \"source\": {\n \"name\": \"CBS News\",\n \"icon\": \"https://lh3.googleusercontent.com/dXy0k7AMf-wXfnj2AtaLk3rZcPGjClkFvKSAQnjoLp9wa_ggxST_WSGqovh984zY8mf3vDmt\",\n \"authors\": [\n \"Elizabeth Napolitano\"\n ]\n },\n \"link\": \"https://www.cbsnews.com/news/apple-vision-pro-launch-virtual-reality-2024/\",\n \"thumbnail\": \"https://assets1.cbsnewsstatic.com/hub/i/r/2024/01/08/9ef5909b-8a3b-4187-9b96-ea5c83ebc027/thumbnail/1200x630g4/08a67d3e4eb80445aabf06b0bf075572/gettyimages-1496190481.jpg?v=c72f52c71e431fd7dde1ba5ae2f69280\",\n \"date\": \"02/02/2024, 08:00 AM, +0000 UTC\"\n },\n {\n \"position\": 84,\n \"title\": \"The iPhone 15 lineup has arrived, and here\u2019s everything you need to know\",\n \"source\": {\n \"name\": \"The Verge\",\n \"icon\": \"https://lh3.googleusercontent.com/vkRH5gyHtLcKAoRSFHK1ATEgKtHDXoi9iRKKOdVhOng8g7qF2_QCVT1f11q_y_4y95_PY5VzWQ\",\n \"authors\": [\n \"Jay Peters\"\n ]\n },\n \"link\": \"https://www.theverge.com/23885548/apple-iphone-15-everything-need-know-news-announcement\",\n \"thumbnail\": \"https://cdn.vox-cdn.com/thumbor/55tJEnalEYRrWue3H3_BBhkMNpo=/0x0:2040x1360/1200x628/filters:focal(1020x680:1021x681)/cdn.vox-cdn.com/uploads/chorus_asset/file/24931976/236794_iPhone_15_pro_pro_Max_VPavic_0020.jpg\",\n \"date\": \"04/28/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 85,\n \"title\": \"Good news for AirPods, bad news for Apple [The CultCast]\",\n \"source\": {\n \"name\": \"Cult of Mac\",\n \"icon\": \"https://encrypted-tbn2.gstatic.com/faviconV2?url=https://www.cultofmac.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\",\n \"authors\": [\n \"Lewis Wallace\"\n ]\n },\n \"link\": \"https://www.cultofmac.com/news/airpods-and-apple-antitrust-the-cultcast-episode-639\",\n \"thumbnail\": \"https://video-meta.humix.com/poster/7KSQSZ2bBoTY/KPpKoid7QR2_FCtxiN.jpg\",\n \"date\": \"03/23/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 86,\n \"title\": \"Apple News exec on importance of publisher partnerships as The Athletic joins paid-for product\",\n \"source\": {\n \"name\": \"Press Gazette\",\n \"icon\": \"https://encrypted-tbn3.gstatic.com/faviconV2?url=https://pressgazette.co.uk&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\",\n \"authors\": [\n \"Bron Maher\"\n ]\n },\n \"link\": \"https://pressgazette.co.uk/news/apple-news-the-athletic-eddy-cue/\",\n \"thumbnail\": \"https://pressgazette.co.uk/wp-content/uploads/sites/7/2023/06/shutterstock_1354353419-e1686587259217-464x348.jpg\",\n \"date\": \"12/19/2023, 08:00 AM, +0000 UTC\"\n },\n {\n \"position\": 87,\n \"title\": \"Apple is bringing ChatGPT to the iPhone in partnership with OpenAI\",\n \"source\": {\n \"name\": \"CBC News\",\n \"icon\": \"https://encrypted-tbn1.gstatic.com/faviconV2?url=https://www.cbc.ca&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\"\n },\n \"link\": \"https://www.cbc.ca/news/business/apple-chatgpt-iphone-openai-1.7230465\",\n \"thumbnail\": \"https://i.cbc.ca/1.7230495.1718047636!/fileImage/httpImage/image.JPG_gen/derivatives/16x9_940/apple-conference.JPG\",\n \"date\": \"06/10/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 88,\n \"title\": \"Why Apple is urging \u2018all users\u2019 to update their iOS\",\n \"source\": {\n \"name\": \"The Hill\",\n \"icon\": \"https://lh3.googleusercontent.com/4GIV6VDGgeRBBo20kfZHEFjDrgPr1lxJmvxB32KUmZWsAU54y7SD2dfT385jXBnmdBoBMaM29A\",\n \"authors\": [\n \"Jeremy Tanner\"\n ]\n },\n \"link\": \"https://thehill.com/homenews/nexstar_media_wire/4341501-why-apple-is-urging-all-users-to-update-their-ios/\",\n \"thumbnail\": \"https://thehill.com/wp-content/uploads/sites/2/2023/12/GettyImages-1668909312-e1701721757890.jpg?strip=1\",\n \"date\": \"12/04/2023, 08:00 AM, +0000 UTC\"\n },\n {\n \"position\": 89,\n \"title\": \"Our 10 Favorite News Aggregators of 2024\",\n \"source\": {\n \"name\": \"Lifewire\",\n \"icon\": \"https://lh3.googleusercontent.com/AO0mkVbn7LYlaW8aa9yJBiY5OHrRtFFFt9o0SSVE-8NQIerDpAX1Aju4kGdJqAik1aw3zVbMdw\",\n \"authors\": [\n \"Stefanie Fogel\"\n ]\n },\n \"link\": \"https://www.lifewire.com/best-news-aggregators-4584410\",\n \"thumbnail\": \"https://www.lifewire.com/thmb/XhdDeNZWfaiFLtXmJH5voFiikMs=/1500x0/filters:no_upscale():max_bytes(150000):strip_icc()/Flipboard-5c464aa846e0fb0001dd8746.jpg\",\n \"date\": \"07/17/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 90,\n \"title\": \"Apple Intelligence: ChatGPT coming to iPhones in AI overhaul\",\n \"source\": {\n \"name\": \"BBC\",\n \"icon\": \"https://encrypted-tbn3.gstatic.com/faviconV2?url=https://www.bbc.co.uk&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\",\n \"authors\": [\n \"Zoe Kleinman\",\n \"Liv Mcmahon\"\n ]\n },\n \"link\": \"https://www.bbc.co.uk/news/articles/c4nn5mejl89o\",\n \"thumbnail\": \"https://ichef.bbci.co.uk/news/1024/branded_news/1b13/live/1589a5d0-2764-11ef-9d0a-ef8fa1b61375.jpg\",\n \"date\": \"06/11/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 91,\n \"title\": \"Apple\u2019s sales fall for the fourth straight quarter despite a strong start for latest iPhones\",\n \"source\": {\n \"name\": \"The Associated Press\",\n \"icon\": \"https://lh3.googleusercontent.com/M087pJgRw3PLf4gl-Y7U-tJn6uaN99AUbFIuX7fmMnhq5QeNylJQMq_UeYPPVaEPk-5jL9I3QA\",\n \"authors\": [\n \"Michael Liedtke\"\n ]\n },\n \"link\": \"https://apnews.com/article/apple-sales-slump-iphone-quarterly-earnings-a8e34afb6f6c04610cca638bda1c7443\",\n \"thumbnail\": \"https://dims.apnews.com/dims4/default/7a7007a/2147483647/strip/true/crop/8209x5473+0+0/resize/599x399!/quality/90/?url=https%3A%2F%2Fassets.apnews.com%2Fee%2Fe6%2Fee57c7ccf36d465f5acd1bef0167%2F1b154a879b004226a75814b66f708fb3\",\n \"date\": \"11/02/2023, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 92,\n \"title\": \"Tech News Today: Google search quality slips, Apple axes Watch Series 9 blood oxygen sensor, and more\",\n \"source\": {\n \"name\": \"The Indian Express\",\n \"icon\": \"https://lh3.googleusercontent.com/kkBP5GMG7WhGg_OaGvdoYp6jxPdIe5_HE4NLhmd8-80hpps2K2BcHM47_XxnxBo9ub0jbx1ZZQ\"\n },\n \"link\": \"https://indianexpress.com/article/technology/tech-news-technology/tech-news-today-19-january-2024-google-search-quality-apple-blood-oxygen-9117718/\",\n \"date\": \"01/19/2024, 08:00 AM, +0000 UTC\"\n },\n {\n \"position\": 93,\n \"title\": \"Apple previews new features coming to Apple services this fall\",\n \"source\": {\n \"name\": \"Apple\",\n \"icon\": \"https://encrypted-tbn2.gstatic.com/faviconV2?url=https://www.apple.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\"\n },\n \"link\": \"https://www.apple.com/newsroom/2023/06/apple-previews-new-features-coming-to-apple-services-this-fall/\",\n \"thumbnail\": \"https://www.apple.com/newsroom/images/live-action/wwdc-2023/standard/services-roundup/Apple-WWDC23-Apple-services-new-features-3-up_big.jpg.large.jpg\",\n \"date\": \"06/07/2023, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 94,\n \"title\": \"Over 100 new podcasts from top apps and services launch on Apple Podcasts\",\n \"source\": {\n \"name\": \"Apple\",\n \"icon\": \"https://encrypted-tbn2.gstatic.com/faviconV2?url=https://www.apple.com&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\"\n },\n \"link\": \"https://www.apple.com/newsroom/2023/09/over-100-new-podcasts-from-top-apps-and-services-launch-on-apple-podcasts/\",\n \"thumbnail\": \"https://www.apple.com/newsroom/images/2023/09/over-100-new-podcasts-launched-on-apple-podcasts/article/Apple-Podcasts-hero_big.jpg.large.jpg\",\n \"date\": \"09/26/2023, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 95,\n \"title\": \"How latest iPhone OS update has 'dragged' Apple in Israel-Palestine conflict\",\n \"source\": {\n \"name\": \"The Times of India\",\n \"icon\": \"https://lh3.googleusercontent.com/d9mz-OKghOQPsgxRv1BQzQAI44ifiA_6aAk-gRwo4_32mZXM-TSd5vIY1rL1P2LUH9mFQPnUSRE\"\n },\n \"link\": \"https://timesofindia.indiatimes.com/technology/tech-news/how-latest-iphone-os-update-has-dragged-apple-in-israel-palestine-conflict/articleshow/109304999.cms\",\n \"thumbnail\": \"https://static.toiimg.com/thumb/msid-109304974,width-1280,height-720,resizemode-4/109304974.jpg\",\n \"date\": \"04/15/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 96,\n \"title\": \"Apple sales fall in nearly all markets\",\n \"source\": {\n \"name\": \"BBC\",\n \"icon\": \"https://encrypted-tbn3.gstatic.com/faviconV2?url=https://www.bbc.co.uk&client=NEWS_360&size=96&type=FAVICON&fallback_opts=TYPE,SIZE,URL\",\n \"authors\": [\n \"Natalie Sherman\"\n ]\n },\n \"link\": \"https://www.bbc.co.uk/news/articles/c99zxzjqw2ko\",\n \"thumbnail\": \"https://ichef.bbci.co.uk/news/1024/branded_news/7b27/live/fb16e820-0954-11ef-b6ce-2bc209dc2066.png\",\n \"date\": \"05/03/2024, 07:00 AM, +0000 UTC\"\n },\n {\n \"position\": 97,\n \"title\": \"Apple AI plans get clearer, company is looking to train its LLM on top news content\",\n \"source\": {\n \"name\": \"India Today\",\n \"icon\": \"https://lh3.googleusercontent.com/KWKtiaerfOnNxQfpRY5T_b-A6Fl2r2RDpTumesYVdF8wcgqQiBklPObMDBVQ4DBDDWeKKewE\",\n \"authors\": [\n \"Divya Bhati\"\n ]\n },\n \"link\": \"https://www.indiatoday.in/technology/news/story/apple-ai-plans-get-clearer-company-is-looking-to-train-its-llm-on-top-news-content-2479799-2023-12-24\",\n \"thumbnail\": \"https://akm-img-a-in.tosshub.com/indiatoday/images/story/202312/apple-23271361-16x9.jpg?VersionId=2Hc49LYxQGEt88izzcGY.0ITNvHgW3xO?size=1200:675\",\n \"date\": \"12/24/2023, 08:00 AM, +0000 UTC\"\n },\n {\n \"position\": 98,\n \"title\": \"Apple's value plunged nearly $1 trillion in 2022. Here's what that says about the economy\",\n \"source\": {\n \"name\": \"ABC News\",\n \"icon\": \"https://lh3.googleusercontent.com/X8gOYJVMpwt5Rdxa-TEs1Av4_oZNCCtQN-1abkvvfNdvy3JvVhT1mERLPhFXBI6xsCV4K_lQpJI\",\n \"authors\": [\n \"Max Zahn\"\n ]\n },\n \"link\": \"https://abcnews.go.com/Business/apples-plunged-1-trillion-2022-economy/story?id=95930467\",\n \"thumbnail\": \"https://s.abcnews.com/images/Business/apple-1-gty-er-221230_1672426670831_hpMain_16x9_1600.jpg\",\n \"date\": \"12/31/2022, 08:00 AM, +0000 UTC\"\n },\n {\n \"position\": 99,\n \"title\": \"Tech News Today: Xiaomi\u2019s first electric car, Apple\u2019s endless beef with authorities, and more\",\n \"source\": {\n \"name\": \"The Indian Express\",\n \"icon\": \"https://lh3.googleusercontent.com/kkBP5GMG7WhGg_OaGvdoYp6jxPdIe5_HE4NLhmd8-80hpps2K2BcHM47_XxnxBo9ub0jbx1ZZQ\"\n },\n \"link\": \"https://indianexpress.com/article/technology/tech-news-technology/tech-news-today-29-december-2023-xiaomi-su7-ev-apple-watch-ban-faamng-9087377/\",\n \"date\": \"12/29/2023, 08:00 AM, +0000 UTC\"\n },\n {\n \"position\": 100,\n \"title\": \"All the news from Apple\u2019s \u201cScary Fast\u201d Mac event\",\n \"source\": {\n \"name\": \"The Verge\",\n \"icon\": \"https://lh3.googleusercontent.com/vkRH5gyHtLcKAoRSFHK1ATEgKtHDXoi9iRKKOdVhOng8g7qF2_QCVT1f11q_y_4y95_PY5VzWQ\",\n \"authors\": [\n \"\u02bfUmar Sh\u0101kir\"\n ]\n },\n \"link\": \"https://www.theverge.com/2023/10/30/23933672/apple-event-mac-october-news-updates-products-scary-fast\",\n \"thumbnail\": \"https://i.ytimg.com/vi/gN8oCWGeRtI/mqdefault.jpg\",\n \"date\": \"10/30/2023, 07:00 AM, +0000 UTC\"\n }\n ],\n \"menu_links\": [\n {\n \"title\": \"U.S.\",\n \"topic_token\": \"CAAqIggKIhxDQkFTRHdvSkwyMHZNRGxqTjNjd0VnSmxiaWdBUAE\",\n \"serpapi_link\": \"https://serpapi.com/search.json?engine=google_news&topic_token=CAAqIggKIhxDQkFTRHdvSkwyMHZNRGxqTjNjd0VnSmxiaWdBUAE\"\n },\n {\n \"title\": \"World\",\n \"topic_token\": \"CAAqJggKIiBDQkFTRWdvSUwyMHZNRGx1YlY4U0FtVnVHZ0pWVXlnQVAB\",\n \"serpapi_link\": \"https://serpapi.com/search.json?engine=google_news&topic_token=CAAqJggKIiBDQkFTRWdvSUwyMHZNRGx1YlY4U0FtVnVHZ0pWVXlnQVAB\"\n },\n {\n \"title\": \"Your local news\",\n \"topic_token\": \"CAAqHAgKIhZDQklTQ2pvSWJHOWpZV3hmZGpJb0FBUAE\",\n \"serpapi_link\": \"https://serpapi.com/search.json?engine=google_news&topic_token=CAAqHAgKIhZDQklTQ2pvSWJHOWpZV3hmZGpJb0FBUAE\"\n },\n {\n \"title\": \"Business\",\n \"topic_token\": \"CAAqJggKIiBDQkFTRWdvSUwyMHZNRGx6TVdZU0FtVnVHZ0pWVXlnQVAB\",\n \"serpapi_link\": \"https://serpapi.com/search.json?engine=google_news&topic_token=CAAqJggKIiBDQkFTRWdvSUwyMHZNRGx6TVdZU0FtVnVHZ0pWVXlnQVAB\"\n },\n {\n \"title\": \"Technology\",\n \"topic_token\": \"CAAqJggKIiBDQkFTRWdvSUwyMHZNRGRqTVhZU0FtVnVHZ0pWVXlnQVAB\",\n \"serpapi_link\": \"https://serpapi.com/search.json?engine=google_news&topic_token=CAAqJggKIiBDQkFTRWdvSUwyMHZNRGRqTVhZU0FtVnVHZ0pWVXlnQVAB\"\n },\n {\n \"title\": \"Entertainment\",\n \"topic_token\": \"CAAqJggKIiBDQkFTRWdvSUwyMHZNREpxYW5RU0FtVnVHZ0pWVXlnQVAB\",\n \"serpapi_link\": \"https://serpapi.com/search.json?engine=google_news&topic_token=CAAqJggKIiBDQkFTRWdvSUwyMHZNREpxYW5RU0FtVnVHZ0pWVXlnQVAB\"\n },\n {\n \"title\": \"Sports\",\n \"topic_token\": \"CAAqJggKIiBDQkFTRWdvSUwyMHZNRFp1ZEdvU0FtVnVHZ0pWVXlnQVAB\",\n \"serpapi_link\": \"https://serpapi.com/search.json?engine=google_news&topic_token=CAAqJggKIiBDQkFTRWdvSUwyMHZNRFp1ZEdvU0FtVnVHZ0pWVXlnQVAB\"\n },\n {\n \"title\": \"Science\",\n \"topic_token\": \"CAAqJggKIiBDQkFTRWdvSUwyMHZNRFp0Y1RjU0FtVnVHZ0pWVXlnQVAB\",\n \"serpapi_link\": \"https://serpapi.com/search.json?engine=google_news&topic_token=CAAqJggKIiBDQkFTRWdvSUwyMHZNRFp0Y1RjU0FtVnVHZ0pWVXlnQVAB\"\n },\n {\n \"title\": \"Health\",\n \"topic_token\": \"CAAqIQgKIhtDQkFTRGdvSUwyMHZNR3QwTlRFU0FtVnVLQUFQAQ\",\n \"serpapi_link\": \"https://serpapi.com/search.json?engine=google_news&topic_token=CAAqIQgKIhtDQkFTRGdvSUwyMHZNR3QwTlRFU0FtVnVLQUFQAQ\"\n }\n ]\n}" +} diff --git a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-e92c14654ff46872c21a06df358fda88.json b/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-e92c14654ff46872c21a06df358fda88.json new file mode 100644 index 0000000..1294b37 --- /dev/null +++ b/tests/Fixtures/Saloon/Tools/SerpAPIGoogleNewsTool-e92c14654ff46872c21a06df358fda88.json @@ -0,0 +1,27 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 26 Oct 2024 00:23:55 GMT", + "Content-Type": "application\/json", + "Content-Length": "1704", + "Connection": "keep-alive", + "access-control-expose-headers": "X-Request-ID", + "openai-organization": "REDACTED", + "openai-processing-ms": "8733", + "openai-version": "2020-10-01", + "x-ratelimit-limit-requests": "10000", + "x-ratelimit-limit-tokens": "2000000", + "x-ratelimit-remaining-requests": "9999", + "x-ratelimit-remaining-tokens": "1992623", + "x-ratelimit-reset-requests": "6ms", + "x-ratelimit-reset-tokens": "221ms", + "x-request-id": "REDACTED", + "strict-transport-security": "max-age=31536000; includeSubDomains; preload", + "CF-Cache-Status": "DYNAMIC", + "X-Content-Type-Options": "nosniff", + "Server": "cloudflare", + "CF-RAY": "REDACTED", + "alt-svc": "h3=\":443\"; ma=86400" + }, + "data": "{\n \"id\": \"chatcmpl-AMOskNNzDHX3dNiuuylgFxGFwGfjZ\",\n \"object\": \"chat.completion\",\n \"created\": 1729902226,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"1. Is Apple Stock A Buy Before September-Quarter Earnings? Read more here: https:\/\/www.investors.com\/news\/technology\/apple-stock-buy-now-aapl-stock\/ (Published on 10\/21\/2024)\\\\n2. Apple Loop: iPhone 17 Pro Leaks, Surprise iPad Mini Launch, New MacBook Pro Specs. Full article here: https:\/\/www.forbes.com\/sites\/ewanspence\/2024\/10\/18\/apple-news-headliens-iphone-17-pro-ipad-mini-macbook-pro-macos-ai-iphone-se\/ (Published on 10\/18\/2024)\\\\n3. Apple set to unveil iPhone 16 on Monday. Here's what to expect: https:\/\/www.cbsnews.com\/news\/apple-iphone-16-what-to-expect\/ (Published on 09\/09\/2024)\\\\n4. Apple embraces the AI craze with its newly unleashed iPhone 16 lineup, full story at https:\/\/apnews.com\/article\/apple-iphone-16-artificial-intelligence-google-samsung-4f30bf40ad89793d80f8ac3a20f9e79c (Published on 09\/09\/2024)\\\\n5. Apple picking at Mass. farm ends with racial profiling, scuffle, family says. Details here: https:\/\/www.nbcboston.com\/news\/local\/danvers-apple-picking-racial-profiling-claim\/3520353\/ (Published on 10\/15\/2024)\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 9186,\n \"completion_tokens\": 323,\n \"total_tokens\": 9509,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_ed14c08274\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-600667e7881befb7566aabff802e23d8.json b/tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-600667e7881befb7566aabff802e23d8.json new file mode 100644 index 0000000..0abb0fb --- /dev/null +++ b/tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-600667e7881befb7566aabff802e23d8.json @@ -0,0 +1,27 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 26 Oct 2024 00:25:15 GMT", + "Content-Type": "application\/json", + "Content-Length": "676", + "Connection": "keep-alive", + "access-control-expose-headers": "X-Request-ID", + "openai-organization": "REDACTED", + "openai-processing-ms": "885", + "openai-version": "2020-10-01", + "x-ratelimit-limit-requests": "10000", + "x-ratelimit-limit-tokens": "2000000", + "x-ratelimit-remaining-requests": "9999", + "x-ratelimit-remaining-tokens": "1998632", + "x-ratelimit-reset-requests": "6ms", + "x-ratelimit-reset-tokens": "41ms", + "x-request-id": "REDACTED", + "strict-transport-security": "max-age=31536000; includeSubDomains; preload", + "CF-Cache-Status": "DYNAMIC", + "X-Content-Type-Options": "nosniff", + "Server": "cloudflare", + "CF-RAY": "REDACTED", + "alt-svc": "h3=\":443\"; ma=86400" + }, + "data": "{\n \"id\": \"chatcmpl-AMOuBRqTO4zR0DQ15lvKhfDdlDiJB\",\n \"object\": \"chat.completion\",\n \"created\": 1729902315,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Joe Biden\\\"\\n}\\n```\",\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1460,\n \"completion_tokens\": 15,\n \"total_tokens\": 1475,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_ed14c08274\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-8c4de06e2a7064e26c30dd1131e7c149.json b/tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-8c4de06e2a7064e26c30dd1131e7c149.json new file mode 100644 index 0000000..54c6af3 --- /dev/null +++ b/tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-8c4de06e2a7064e26c30dd1131e7c149.json @@ -0,0 +1,27 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 26 Oct 2024 00:25:13 GMT", + "Content-Type": "application\/json", + "Content-Length": "954", + "Connection": "keep-alive", + "access-control-expose-headers": "X-Request-ID", + "openai-organization": "REDACTED", + "openai-processing-ms": "959", + "openai-version": "2020-10-01", + "x-ratelimit-limit-requests": "10000", + "x-ratelimit-limit-tokens": "2000000", + "x-ratelimit-remaining-requests": "9999", + "x-ratelimit-remaining-tokens": "1999865", + "x-ratelimit-reset-requests": "6ms", + "x-ratelimit-reset-tokens": "4ms", + "x-request-id": "REDACTED", + "strict-transport-security": "max-age=31536000; includeSubDomains; preload", + "CF-Cache-Status": "DYNAMIC", + "X-Content-Type-Options": "nosniff", + "Server": "cloudflare", + "CF-RAY": "REDACTED", + "alt-svc": "h3=\":443\"; ma=86400" + }, + "data": "{\n \"id\": \"chatcmpl-AMOu8oMwQGvFAiR5i7xnk8kEY6DbG\",\n \"object\": \"chat.completion\",\n \"created\": 1729902312,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_q6qWvWHnuWLdgKTsd8AKM58x\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"serp_a_p_i_google_search_tool\",\n \"arguments\": \"{\\\"query\\\":\\\"current president of the United States\\\"}\"\n }\n }\n ],\n \"refusal\": null\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 206,\n \"completion_tokens\": 25,\n \"total_tokens\": 231,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0\n }\n },\n \"system_fingerprint\": \"fp_ed14c08274\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-Tool.json b/tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-Tool.json new file mode 100644 index 0000000..d48b73e --- /dev/null +++ b/tests/Fixtures/Saloon/Tools/SerpAPIGoogleSearchTool-Tool.json @@ -0,0 +1,12 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Sat, 26 Oct 2024 00:25:14 GMT", + "Content-Type": "application/json; charset=utf-8", + "Content-Length": "44092", + "Connection": "keep-alive", + "x-frame-options": "SAMEORIGIN", + "x-xss-protection": "1; mode=block" + }, + "data": "{\n \"search_metadata\": {\n \"id\": \"671c36e9c4bcf5bca3e80727\",\n \"status\": \"Success\",\n \"json_endpoint\": \"https://serpapi.com/searches/994a79c8b3a78975/671c36e9c4bcf5bca3e80727.json\",\n \"created_at\": \"2024-10-26 00:25:13 UTC\",\n \"processed_at\": \"2024-10-26 00:25:13 UTC\",\n \"google_url\": \"https://www.google.com/search?q=current+president+of+the+United+States&oq=current+president+of+the+United+States&num=10&sourceid=chrome&ie=UTF-8\",\n \"raw_html_file\": \"https://serpapi.com/searches/994a79c8b3a78975/671c36e9c4bcf5bca3e80727.html\",\n \"total_time_taken\": 1.22\n },\n \"search_parameters\": {\n \"engine\": \"google\",\n \"q\": \"current president of the United States\",\n \"google_domain\": \"google.com\",\n \"num\": \"10\",\n \"device\": \"desktop\"\n },\n \"search_information\": {\n \"query_displayed\": \"current president of the United States\",\n \"total_results\": 926000000,\n \"time_taken_displayed\": 0.4,\n \"organic_results_state\": \"Results for exact spelling\"\n },\n \"knowledge_graph\": {\n \"title\": \"Joe Biden\",\n \"type\": \"46th U.S. President\",\n \"entity_type\": \"people, athlete\",\n \"kgmid\": \"/m/012gx2\",\n \"knowledge_graph_search_link\": \"https://www.google.com/search?kgmid=/m/012gx2&hl=en-US&q=Joe+Biden\",\n \"serpapi_knowledge_graph_search_link\": \"https://serpapi.com/search.json?device=desktop&engine=google&google_domain=google.com&hl=en-US&kgmid=%2Fm%2F012gx2&num=10&q=Joe+Biden\",\n \"header_images\": [\n {\n \"image\": \"https://serpapi.com/searches/671c36e9c4bcf5bca3e80727/images/f4afd08ef7d734dfde462b72c068d72ff721367a6a963c1c33219bfea7e2189bb33f1d4aaa5d5d5d.webp\"\n },\n {\n \"image\": \"https://serpapi.com/searches/671c36e9c4bcf5bca3e80727/images/f4afd08ef7d734dfde462b72c068d72ff721367a6a963c1c022521bc1dc5865de85622dc2659e003.webp\"\n },\n {\n \"image\": \"https://serpapi.com/searches/671c36e9c4bcf5bca3e80727/images/f4afd08ef7d734dfde462b72c068d72ff721367a6a963c1c53016c9f19cd71f8e72ab813f5ca518b.webp\"\n }\n ],\n \"website\": \"https://www.whitehouse.gov/administration/president-biden/\",\n \"born\": \"November 20, 1942 (age 81 years), Scranton, PA\",\n \"born_links\": [\n {\n \"text\": \"Scranton, PA\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=Scranton&si=ACC90nyvvWro6QmnyY1IfSdgk5wwjB1r8BGd_IWRjXqmKPQqm2EZLCY33SRJUwAbMyILe9ZYvWR48da73TEAYEa-DWofQ_zzM8YXtrrAuKdRdz8_jwERmQ54VngswC6NGdVm-Uw7JUkpoo9GjfXwDkQBXLO0pQ5R9L8mVAd4zGJqjD9EyBowzC_A1wzmYHlyoqdIwojtRD4S&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0QmxMoAHoECDIQAg\"\n }\n ],\n \"organizations_founded\": \"United States Department of Defense China Task Force\",\n \"organizations_founded_links\": [\n {\n \"text\": \"United States Department of Defense China Task Force\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=United+States+Department+of+Defense+China+Task+Force&si=ACC90nwLLwns5sISZcdzuISy7t-NHozt8Cbt6G3WNQfC9ekAgE1g6nlV1psrsA6W4s4OrKxpg_xQ7PHcADkxSX4GwDRYKYLgPz-0tSPsvrY_Dfc3LU8IWO5gOEKWpnN-kQLDikUYyAc2w_nYLwFXC1q5zk_-yNZUDNcT2fp9NWpUng12JeSndTELHmXP2n34vehcNTydlSasILmb6mTRqAdsbdNlrt-ZePnRCBF1iEaEtYnGt_vvUFSkkM_d9Rmuf3vZnZzBXWwHy07j7gWRu-R2ACqA-bUj0vaporPDbMXGttRr_mYS7Ij8ly-O78dfB1Ok8QX79jYhoActb0qKcBMNAtnL8Dk_AkKqdoXpc8fkn1XgFxEgxl0%3D&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0QmxMoAHoECDEQAg\"\n },\n {\n \"text\": \"See more\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=joe+biden+organizations+founded&stick=H4sIAAAAAAAAAOPgE-LUz9U3MDRKrzDSsswot9JPzs_JSU0uyczP088vSk_My6xKBHHi0_JL81JSi4qtIIwUBWTZRazyWfmpCkmZKal5KBLFClDlAN6zbvNqAAAA&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0Q44YBKAF6BAgxEAM\"\n }\n ],\n \"grandchildren\": \"Navy Joan Roberts, Finnegan Biden, Maisy Biden, Natalie Biden, Naomi Biden, Robert Biden II\",\n \"grandchildren_links\": [\n {\n \"text\": \"Navy Joan Roberts\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=Navy+Joan+Roberts&si=ACC90nwLLwns5sISZcdzuISy7t-NHozt8Cbt6G3WNQfC9ekAgGBO1k0Fw9J7eiXIAluOC-h3x9kWnCEJLYw0la7WK3Omp0d2JsScWW1rQ8_czyUaObhJJ0A_Jn5HfPbr0fCcfno6x_j1bMCZqQO1y_Jd11erbDSEEFYImHvmpum7-D-aa6A_aSUDCVinnG6yFGURviXPRELfldPI7m1GsNkmX0lHQfiWFDw8GzcYQyT_vUrof8-zLFqxUPdWlsnky-eGa_4x30pTZwZsPkdqkWMzPNRR84_1xUrRMvuBL9Ah-EDa7gsVvg0%3D&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0QmxMoAHoECDAQAg\"\n },\n {\n \"text\": \"Finnegan Biden\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=Finnegan+Biden&si=ACC90ny8E30vD16OoPAAI4cStfcliGy35W8UAhb0TsHNc_ISQauVu4G0hIQv7fc43FGsjhKZTj_XUbYWBwbsWuegUqJCbp21rtbRxSZB-CZ61IZpFGStoWH1WtSZfgBWTqBxZ1EN2MdUzCeNseI7lv_h85TY5-WL_LjYQSkdLOesnmfUCWEB96Ro53WQEzvUaa-fLt3V4jj9NjD4BNgWl9AxuYWv7awPnEGC7KlLgX1jHXIOMHnJc2T_8KvENhCN_UGb7z-dV_-6lys7vbLSRjpQbuNlixaCYg%3D%3D&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0QmxMoAXoECDAQAw\"\n },\n {\n \"text\": \"Maisy Biden\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=Maisy+Biden&si=ACC90ny8E30vD16OoPAAI4cStfcliGy35W8UAhb0TsHNc_ISQUcR8mmtY-_S5_nyD-HJlhyanoVc___KFVbmfkFHDuBodfjyQW3Zb5nV0OXlHbmmrJfwE9n2Y-uNjTuygS7rl1VwBSenl4Rh0A1MeWwvacWXjeZPKFCe6AUeMf-5v6Y8Dd0fJzbdkXZy_38tpvivSyvIrWs5ANyFnpjvdyxDjC3AmGHrqqbAncI0YxpsMwQL2qC_djqi9AIRq7B6uY7O6TQf8fAVp1CrVAhbIGy7ycLbjyMpMw%3D%3D&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0QmxMoAnoECDAQBA\"\n },\n {\n \"text\": \"Natalie Biden\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=Natalie+Biden&si=ACC90ny8E30vD16OoPAAI4cStfcliGy35W8UAhb0TsHNc_ISQeHc8_rzepqdBr3oHPWyn600qOsJHsKvQx4I2FIdKctMlaBfqNUTar5Y1BbcrM8jQv1G0257jwiJQzw5RK2u5qq6fP3ZXJP7gkPyeliAEMrOXISWutlszhADGKQfqsGd7Gq166w2f6UdHhazPDw5L0I43Uvk0oOmDNLHB5WY8HCm7AML__j7mCKwnZWi4_K2Jlp0gD3t0wCDnp-xNxUE__QFK_UrD9HTWfq_u5EIVwxx4Gfw2w%3D%3D&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0QmxMoA3oECDAQBQ\"\n },\n {\n \"text\": \"Naomi Biden\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=Naomi+Biden&si=ACC90ny8E30vD16OoPAAI4cStfcliGy35W8UAhb0TsHNc_ISQUCnqIBK-OChIi9DYVRUllksDLLsauXRg6UAPslNKKJV5A1Nlmur75Xh7A2L_FQvKE7HjKvg6qADyRybOZZE1y6CxbX83c7ejYOvWO4SuYqouenZkKCv05Men-Z-fb_kdHSx9Mw8HiyY7vkIKGBvYb28d8TR--R8hcU0oMcRMysKgC0r7Uo7BCHqmgRxWJ5R7wo8ncbrtMzR8z754Hg3h7z2qP90yf_YEkoc2pKPWY50nsEZlQ%3D%3D&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0QmxMoBHoECDAQBg\"\n },\n {\n \"text\": \"Robert Biden II\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=Robert+Biden+II&si=ACC90ny8E30vD16OoPAAI4cStfcliGy35W8UAhb0TsHNc_ISQREBJUEQ3-xrOz-cJiODYcOGvbRLeGq7VeV_FiFRquSupTOTNogbd_iqTwfJ-szApTTtfrIf7wbXHZhStwAtp5H8W7qxLG24SIWP_HwN35iwmMFNX8o6XxmJHbYAAOtGlCmZ1QfgD0o43kqV3NO9xjz87lBmkjL5lj0FUxzUVhxF_B3zVROgdHvWUXnRoLUJaIScCwhtiH60zsPEI2s5GfmGMVHeGi42bSgWIWjf75USq57MOg%3D%3D&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0QmxMoBXoECDAQBw\"\n }\n ],\n \"grandparents\": \"Mary Elizabeth Robinette Biden, Ambrose J. Finnegan, Joseph H. Biden, Geraldine C. Blewitt\",\n \"grandparents_links\": [\n {\n \"text\": \"Mary Elizabeth Robinette Biden\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=Mary+Elizabeth+Robinette+Biden&si=ACC90nwLLwns5sISZcdzuISy7t-NHozt8Cbt6G3WNQfC9ekAgBHJLIINkT9aYXgbtFPvgQd-kcQhwFRMti1rgpedDgJKsFFmZIBJtpsK-sYE2Ypi9dkqq-y1YEcgstxi8-N-JWFzPrfO3ROmGxU_42LMKOYTabKn84QGP3BNMA_fJxl9ffDCrf5yx_xa066sXUtXCwcbdah0krNAOvCST4CEgMvKZ5iT3a6a4EScH8o8x005cnbzQgi1IxBq3x619kFxh37tBxcNwobfpMHSeL2n3xjVGlbnjGyVh85H3Fr06k15-jKc-iKx3qfuvDtN6EzzfQyJel-L&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0QmxMoAHoECC4QAg\"\n },\n {\n \"text\": \"Ambrose J. Finnegan\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=Ambrose+J.+Finnegan&si=ACC90nyByJNAHfkzzi7l4JA4fcQKXOYDCI7plJH6uVksGWg6XlUrE1PCCLclo11PpDvum35_ZMMXAUBFFECIbLX_us44wGRV1HqgapndcDM7WJwspW4isSVTTukZ21DYgWLvNIAZS0ygJ_YXzlk35rbYjSCYaVtwMVMC4nOzeY9E3jqW9oB_3cAnNAeyTDOYmgmUhUEp2LLXTGmIyZnBrNYh6Q7uTD0oSuqvQVXn4QziiBqKdK9i6LYxhXAr-RudIQHSgbYfiKf5SiL_PztJZCFpo_a1MV0obPIHixTCTPqSCEHGjNEbpA8%3D&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0QmxMoAXoECC4QAw\"\n },\n {\n \"text\": \"Joseph H. Biden\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=Joseph+H.+Biden&si=ACC90nwLLwns5sISZcdzuISy7t-NHozt8Cbt6G3WNQfC9ekAgHbh__85qw2jT4PRA4VjIRAIQz1HP1CGkEXFqJAGVGnsWpApd7QnfucVtTnXdpXaxIclEZb2O8KTykrxITGnkKo9mxwKxNg09vKJQiWbz32dv2_GSqRxDAB0cn3Iq2lesx0jLEl8AGMjk5Alyt5Y95QOUnViTHc--51cqqSz4cxWoVwGNIpsoUj3kg60vPZOxGK8zqWeOlNDPbAmyaOyI5qQfgYiKVmRjozLhtYOPTWOjOUSBSnvVXmhHBtEtl3hSbPGsc4%3D&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0QmxMoAnoECC4QBA\"\n },\n {\n \"text\": \"Geraldine C. Blewitt\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=Geraldine+C.+Blewitt&si=ACC90nyByJNAHfkzzi7l4JA4fcQKXOYDCI7plJH6uVksGWg6XjCvpGreiIu5eQP4ovnI7FAryP2eZx77OnNzOoDThI4LaSMvhXSz-mFsaRUyIOcLrbOx234IktXZbSxPC5QWpQ-Cti1A5w4PS3jnPzU1kJX61vHhntzGr-ceNxcT3mXAihg0FYSmyLx3yFicxpeWeYwrjSBh06Om5VmIMfAd5tDJ7PClobwz02Mr0FwK5cC1RXPIkX-Yii5DD86Pivyc5Hg046eOeCtNMrNu7cSe9kfhIhz_-yYEnfNGwGVOKTgMvUjflFI%3D&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0QmxMoA3oECC4QBQ\"\n }\n ],\n \"great_grandparents\": \"George Hamilton Robinette\",\n \"great_grandparents_links\": [\n {\n \"text\": \"George Hamilton Robinette\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=George+Hamilton+Robinette&si=ACC90nwLLwns5sISZcdzuISy7t-NHozt8Cbt6G3WNQfC9ekAgMruhyMP5hzcLaEIFEatpTbCu8jln0IwloowvnNb9QsoKR39hk5KGsJhlpcyDxymTavyI7AcFFsYLjenfJa-f9tv0CH296bGxtreGcN8aiA0YZ3takCS1Uqq7pnedL3CpY1hVM7v8TzJPdU_c0lkl4QPLBGwdkcI5JuIjfB6mL83H0-C5-FbXpp_gged4Q-00B43Sd_xDr_ScZh8JfyK6ToHqp4irVTJuea9fUahKpMTntbBoKTq50hvcVl2ZOUyDjyHnFmLdS3JjxvkTBmW0-gvawyZ&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0QmxMoAHoECDMQAg\"\n },\n {\n \"text\": \"See more\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=joe+biden+great-grandparents&stick=H4sIAAAAAAAAAOPgE-LUz9U3MDRKrzDSUs8ot9JPzs_JSU0uyczP0y9IzS_ISbVKL0pNLFFIL0rMSylILErNK1nEKpOVn6qQlJmSmqcAltVFki0GACl-ijhVAAAA&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0Q44YBKAF6BAgzEAM\"\n }\n ],\n \"marriage_location\": \"New York, NY\",\n \"marriage_location_links\": [\n {\n \"text\": \"New York, NY\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=New+York&si=ACC90nzx_D3_zUKRnpAjmO0UBLNxnt7EyN4YYdru6U3bxLI-L1vhwciuTHTDerN_6A9Mag4Ax1n3X-zP0_QZjYVvvrpJ15Ktq4_1pqvgj5Xpqei9qJoPo_qejnOk72pQxO_HKknRkPql1r4TYoKbJM0oeVfdhnn_58a43Q9K7Ctns8OMb_-SITD6imX23QcSeJhXtmH7sjqA&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0QmxMoAHoECC8QAg\"\n }\n ],\n \"web_results\": [\n {\n \"snippet\": \"Joseph Robinette Biden Jr. is an American politician who has been the 46th and current president of the United States since 2021. A member of the Democratic Party, he served as the 47th vice president from 2009 to 2017 under President Barack Obama and represented Delaware in the U.S. Senate from 1973 to 2009.\",\n \"source\": \"Wikipedia\",\n \"link\": \"https://en.wikipedia.org/wiki/Joe_Biden\"\n },\n {\n \"title\": \"Edited works\",\n \"snippet\": \"Proceedings of the Senate Task Force on Economic Sanctions, Halting the Spread of HIV/AIDS: Future Efforts in the U. S. Bilateral and Multilateral Response: Congressional Hearings, Anti-Terrorism Conventions: Committee on Foreign Relations, U. S. Senate, Executive Report, Dirty Bombs and Basement Nukes: The Terrorist Nuclear Threat - Congressional Hearing, The Threat of Bioterrorism and the Spread of Infectious Diseases: Congressional Hearing, U. S. Security Interests in Europe: Congressional Hearing, Strategies for Homeland Defense: A Compilation by the Committee Foreign Relations, United States Senate, Hearings to Examine Threats, Responses and Regional Considerations Surrounding Iraq: Congressional Hearings, Green Jobs: A Pathway to a Strong Middle Class, Examining the Theft of American Intellectual Property at Home and Abroad: Congressional Hearing, Reducing the Threat of Chemical and Biological Weapons: Congressional Hearing, The Administration's Missle Defense Program and the ABM Treaty: Congressional Hearing, Putin Administration's Policies Toward Non-Russian Regions of the Russian Federation, How Do We Promote Democratization, Poverty Alleviation, and Human Rights to Build a More Secure Future? Congressional Hearing\"\n },\n {\n \"title\": \"Age\",\n \"snippet\": \"81 years Nov 20, 1942\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=joe+biden+age&stick=H4sIAAAAAAAAAOPgE-LUz9U3MDRKrzDSEs1OttIvSM0vyEkFUkXF-XlWiempi1h5s_JTFZIyU1LzFIB8AMGaH2I0AAAA&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0Q18AJegQINhAB\"\n }\n ],\n \"profiles\": [\n {\n \"name\": \"Instagram\",\n \"link\": \"https://www.instagram.com/potus\",\n \"image\": \"https://serpapi.com/searches/671c36e9c4bcf5bca3e80727/images/f4afd08ef7d734dfde462b72c068d72f54032021daa42b287c4a1aaa02e89e7bc44f088a3e6592f3.png\"\n },\n {\n \"name\": \"X (Twitter)\",\n \"link\": \"https://twitter.com/JoeBiden\",\n \"image\": \"https://serpapi.com/searches/671c36e9c4bcf5bca3e80727/images/f4afd08ef7d734dfde462b72c068d72f54032021daa42b286cc2bfb7e8859a5bc5e3eb5e73f5f75f.png\"\n },\n {\n \"name\": \"YouTube\",\n \"link\": \"https://www.youtube.com/joebiden\",\n \"image\": \"https://serpapi.com/searches/671c36e9c4bcf5bca3e80727/images/f4afd08ef7d734dfde462b72c068d72f54032021daa42b28f1d8a13206f8677a394413172e958b4e.png\"\n },\n {\n \"name\": \"Facebook\",\n \"link\": \"https://www.facebook.com/joebiden\",\n \"image\": \"https://serpapi.com/searches/671c36e9c4bcf5bca3e80727/images/f4afd08ef7d734dfde462b72c068d72f54032021daa42b2843eafc655c93486be210b0f3168da841.png\"\n }\n ]\n },\n \"inline_images\": [\n {\n \"thumbnail\": \"https://serpapi.com/searches/671c36e9c4bcf5bca3e80727/images/e837dbbf9e225b25e3971a0e9e7bc86577c6786c64406a2278d13f376ffc2797.jpeg\"\n }\n ],\n \"related_questions\": [\n {\n \"question\": \"Who is the new president of the United States?\",\n \"snippet\": \"As President, Biden will restore America's leadership and build our communities back better.\",\n \"title\": \"Joe Biden: The President | The White House\",\n \"link\": \"https://www.whitehouse.gov/administration/president-biden/#:~:text=As%20President%2C%20Biden%20will%20restore,build%20our%20communities%20back%20better.\",\n \"displayed_link\": \"https://www.whitehouse.gov \u203a administration \u203a presiden...\",\n \"next_page_token\": \"eyJvbnMiOiIxMDA0MSIsImZjIjoiRW9zQkNreEJTa2M1U210T1R6RlZXVWhpWlhWZlJFcFRlREptY1d0bWRrdHhSVFYyZDI5TFRqTmxVWEZtWkZseVZIUXdjRzE0U1dsU01VSlhjRTVaWlRkM2JHSTJibGRQYjJjM1pFeE1lSGhIRWhjMlZGbGpXbDkyU0VweGNYRXdMV3RRYkY5bUxUWkJUUm9pUVVaWWNrVmpjVWx0TVRabWFuRTNNRmRwVW0wdGVXeHJTVTVsTTJONllqTndadyIsImZjdiI6IjMiLCJlaSI6IjZUWWNaX3ZISnFxcTAta1BsX2YtNkFNIiwicWMiOiJjLU5TU3k0dEtrck5LMUVvS0VvdHprd0JzZkxURkVveVVoVks4ekpMVWxNVWlrc1NTMUtMQlJnU0dHc2RsTTNzQVEiLCJxdWVzdGlvbiI6IldobyBpcyB0aGUgbmV3IHByZXNpZGVudCBvZiB0aGUgVW5pdGVkIFN0YXRlcz8iLCJsayI6ImM1UFNLY19JVnk5V0tNbElWY2hMTFZjb0tFb3R6a3hKelN0UnlFOERDNWJtWlpha3BpZ1VseVNXcEJZREFBIiwiYnMiOiJjLU5LNXRJTHo4aFh5Q3hXS01sSVZjaExMVmNvS0VvdHpreEp6U3RSeUU4REM0Ym1aWmFrcGlnRWx5U1dwQmJiUy13M005S1QwaW5QeUZmSG82Y1VvcWNZckljcmhrc0xaRWw1SWtSSFpYNXBYbnBxY1FrV3E0SWQ3U1dPYUJscFMybVdFNldodERpUnk0WkxDdXFGdk5MY3BOUWlCVU9FT251SkRtc2phU25KY2x3S3VEeTRGSkRkWm1KZWtxRlFscG1jaW14R1A3dVJvcFI4T1g1bEFvd0EiLCJpZCI6ImZjXzZUWWNaX3ZISnFxcTAta1BsX2YtNkFNXzEifQ==\",\n \"serpapi_link\": \"https://serpapi.com/search.json?device=desktop&engine=google_related_questions&google_domain=google.com&next_page_token=eyJvbnMiOiIxMDA0MSIsImZjIjoiRW9zQkNreEJTa2M1U210T1R6RlZXVWhpWlhWZlJFcFRlREptY1d0bWRrdHhSVFYyZDI5TFRqTmxVWEZtWkZseVZIUXdjRzE0U1dsU01VSlhjRTVaWlRkM2JHSTJibGRQYjJjM1pFeE1lSGhIRWhjMlZGbGpXbDkyU0VweGNYRXdMV3RRYkY5bUxUWkJUUm9pUVVaWWNrVmpjVWx0TVRabWFuRTNNRmRwVW0wdGVXeHJTVTVsTTJONllqTndadyIsImZjdiI6IjMiLCJlaSI6IjZUWWNaX3ZISnFxcTAta1BsX2YtNkFNIiwicWMiOiJjLU5TU3k0dEtrck5LMUVvS0VvdHprd0JzZkxURkVveVVoVks4ekpMVWxNVWlrc1NTMUtMQlJnU0dHc2RsTTNzQVEiLCJxdWVzdGlvbiI6IldobyBpcyB0aGUgbmV3IHByZXNpZGVudCBvZiB0aGUgVW5pdGVkIFN0YXRlcz8iLCJsayI6ImM1UFNLY19JVnk5V0tNbElWY2hMTFZjb0tFb3R6a3hKelN0UnlFOERDNWJtWlpha3BpZ1VseVNXcEJZREFBIiwiYnMiOiJjLU5LNXRJTHo4aFh5Q3hXS01sSVZjaExMVmNvS0VvdHpreEp6U3RSeUU4REM0Ym1aWmFrcGlnRWx5U1dwQmJiUy13M005S1QwaW5QeUZmSG82Y1VvcWNZckljcmhrc0xaRWw1SWtSSFpYNXBYbnBxY1FrV3E0SWQ3U1dPYUJscFMybVdFNldodERpUnk0WkxDdXFGdk5MY3BOUWlCVU9FT251SkRtc2phU25KY2x3S3VEeTRGSkRkWm1KZWtxRlFscG1jaW14R1A3dVJvcFI4T1g1bEFvd0EiLCJpZCI6ImZjXzZUWWNaX3ZISnFxcTAta1BsX2YtNkFNXzEifQ%3D%3D\"\n },\n {\n \"question\": \"Who was the youngest president of the USA?\",\n \"snippet\": \"The median age at inauguration of incoming U.S. presidents is 55 years. The youngest person to become U.S. president was Theodore Roosevelt, who, at age 42, succeeded to the office after the assassination of William McKinley.\",\n \"title\": \"List of presidents of the United States by age - Wikipedia\",\n \"link\": \"https://en.wikipedia.org/wiki/List_of_presidents_of_the_United_States_by_age#:~:text=The%20median%20age%20at%20inauguration,the%20assassination%20of%20William%20McKinley.\",\n \"displayed_link\": \"https://en.wikipedia.org \u203a wiki \u203a List_of_presidents_of_t...\",\n \"source_logo\": \"https://serpapi.com/searches/671c36e9c4bcf5bca3e80727/images/ad7ee8145e566f1f362fbd875d8257e7aa6eaf65d1ed8283f19c117342d6d7cf.png\",\n \"next_page_token\": \"eyJvbnMiOiIxMDA0MSIsImZjIjoiRW9zQkNreEJTa2M1U210T1R6RlZXVWhpWlhWZlJFcFRlREptY1d0bWRrdHhSVFYyZDI5TFRqTmxVWEZtWkZseVZIUXdjRzE0U1dsU01VSlhjRTVaWlRkM2JHSTJibGRQYjJjM1pFeE1lSGhIRWhjMlZGbGpXbDkyU0VweGNYRXdMV3RRYkY5bUxUWkJUUm9pUVVaWWNrVmpjVWx0TVRabWFuRTNNRmRwVW0wdGVXeHJTVTVsTTJONllqTndadyIsImZjdiI6IjMiLCJlaSI6IjZUWWNaX3ZISnFxcTAta1BsX2YtNkFNIiwicWMiOiJjLU5TU3k0dEtrck5LMUVvS0VvdHprd0JzZkxURkVveVVoVks4ekpMVWxNVWlrc1NTMUtMQlJnU0dHc2RsTTNzQVEiLCJxdWVzdGlvbiI6IldobyB3YXMgdGhlIHlvdW5nZXN0IHByZXNpZGVudCBvZiB0aGUgVVNBPyIsImxrIjoiYzVQU0xNX0lWeWhQTEZZb3lVaFZxTXd2elV0UExTNVJLQ2hLTGM1TVNjMHJVY2hQQTh1VUZpY0NBQSIsImJzIjoiYy1OSzV0SUx6OGhYeUN4V0tNbElWY2hMTFZjb0tFb3R6a3hKelN0UnlFOERDNGJtWlpha3BpZ0VseVNXcEJiYlMtdzNNOUtUMGluUHlGZkhvNmNVb3FjWXJJY3Joa3NMWkVsNUlrUkhaWDVwWG5wcWNRa1dxNElkN1NXT2FCbHBTMm1XRTZXaHREaVJ5NFpMQ3VxRnZOTGNwTlFpQlVPRU9udUpEbXNqYVNuSmNsd0t1RHk0RkpEZFptSmVrcUZRbHBtY2lteEdQN3VSb3BSOE9YNWxBb3dBIiwiaWQiOiJmY182VFljWl92SEpxcXEwLWtQbF9mLTZBTV8xIn0=\",\n \"serpapi_link\": \"https://serpapi.com/search.json?device=desktop&engine=google_related_questions&google_domain=google.com&next_page_token=eyJvbnMiOiIxMDA0MSIsImZjIjoiRW9zQkNreEJTa2M1U210T1R6RlZXVWhpWlhWZlJFcFRlREptY1d0bWRrdHhSVFYyZDI5TFRqTmxVWEZtWkZseVZIUXdjRzE0U1dsU01VSlhjRTVaWlRkM2JHSTJibGRQYjJjM1pFeE1lSGhIRWhjMlZGbGpXbDkyU0VweGNYRXdMV3RRYkY5bUxUWkJUUm9pUVVaWWNrVmpjVWx0TVRabWFuRTNNRmRwVW0wdGVXeHJTVTVsTTJONllqTndadyIsImZjdiI6IjMiLCJlaSI6IjZUWWNaX3ZISnFxcTAta1BsX2YtNkFNIiwicWMiOiJjLU5TU3k0dEtrck5LMUVvS0VvdHprd0JzZkxURkVveVVoVks4ekpMVWxNVWlrc1NTMUtMQlJnU0dHc2RsTTNzQVEiLCJxdWVzdGlvbiI6IldobyB3YXMgdGhlIHlvdW5nZXN0IHByZXNpZGVudCBvZiB0aGUgVVNBPyIsImxrIjoiYzVQU0xNX0lWeWhQTEZZb3lVaFZxTXd2elV0UExTNVJLQ2hLTGM1TVNjMHJVY2hQQTh1VUZpY0NBQSIsImJzIjoiYy1OSzV0SUx6OGhYeUN4V0tNbElWY2hMTFZjb0tFb3R6a3hKelN0UnlFOERDNGJtWlpha3BpZ0VseVNXcEJiYlMtdzNNOUtUMGluUHlGZkhvNmNVb3FjWXJJY3Joa3NMWkVsNUlrUkhaWDVwWG5wcWNRa1dxNElkN1NXT2FCbHBTMm1XRTZXaHREaVJ5NFpMQ3VxRnZOTGNwTlFpQlVPRU9udUpEbXNqYVNuSmNsd0t1RHk0RkpEZFptSmVrcUZRbHBtY2lteEdQN3VSb3BSOE9YNWxBb3dBIiwiaWQiOiJmY182VFljWl92SEpxcXEwLWtQbF9mLTZBTV8xIn0%3D\"\n },\n {\n \"question\": \"Who is number 1 president?\",\n \"snippet\": \"Abraham Lincoln has taken the highest ranking in each survey and George Washington, Franklin D. Roosevelt, and Theodore Roosevelt have always ranked in the top five while James Buchanan, Andrew Johnson, and Franklin Pierce have been ranked at the bottom of all four surveys.\",\n \"title\": \"Historical rankings of presidents of the United States - Wikipedia\",\n \"link\": \"https://en.wikipedia.org/wiki/Historical_rankings_of_presidents_of_the_United_States#:~:text=Abraham%20Lincoln%20has%20taken%20the,bottom%20of%20all%20four%20surveys.\",\n \"displayed_link\": \"https://en.wikipedia.org \u203a wiki \u203a Historical_rankings_of_...\",\n \"source_logo\": \"https://serpapi.com/searches/671c36e9c4bcf5bca3e80727/images/ad7ee8145e566f1f362fbd875d8257e73c43d2b0f14d2e591b248ca6ebe30d32.png\",\n \"next_page_token\": \"eyJvbnMiOiIxMDA0MSIsImZjIjoiRW9zQkNreEJTa2M1U210T1R6RlZXVWhpWlhWZlJFcFRlREptY1d0bWRrdHhSVFYyZDI5TFRqTmxVWEZtWkZseVZIUXdjRzE0U1dsU01VSlhjRTVaWlRkM2JHSTJibGRQYjJjM1pFeE1lSGhIRWhjMlZGbGpXbDkyU0VweGNYRXdMV3RRYkY5bUxUWkJUUm9pUVVaWWNrVmpjVWx0TVRabWFuRTNNRmRwVW0wdGVXeHJTVTVsTTJONllqTndadyIsImZjdiI6IjMiLCJlaSI6IjZUWWNaX3ZISnFxcTAta1BsX2YtNkFNIiwicWMiOiJjLU5TU3k0dEtrck5LMUVvS0VvdHprd0JzZkxURkVveVVoVks4ekpMVWxNVWlrc1NTMUtMQlJnU0dHc2RsTTNzQVEiLCJxdWVzdGlvbiI6IldobyBpcyBudW1iZXIgMSBwcmVzaWRlbnQ/IiwibGsiOiJHaGwzYUc4Z2FYTWdiblZ0WW1WeUlERWdjSEpsYzJsa1pXNTAiLCJicyI6ImMtTks1dElMejhoWHlDeFdLTWxJVmNoTExWY29LRW90emt4SnpTdFJ5RThEQzRibVpaYWtwaWdFbHlTV3BCYmJTLXczTTlLVDBpblB5RmZIbzZjVW9xY1lySWNyaGtzTFpFbDVJa1JIWlg1cFhucHFjUWtXcTRJZDdTV09hQmxwUzJtV0U2V2h0RGlSeTRaTEN1cUZ2TkxjcE5RaUJVT0VPbnVKRG1zamFTbkpjbHdLdUR5NEZKRGRabUpla3FGUWxwbWNpbXhHUDd1Um9wUjhPWDVsQW93QSIsImlkIjoiZmNfNlRZY1pfdkhKcXFxMC1rUGxfZi02QU1fMSJ9\",\n \"serpapi_link\": \"https://serpapi.com/search.json?device=desktop&engine=google_related_questions&google_domain=google.com&next_page_token=eyJvbnMiOiIxMDA0MSIsImZjIjoiRW9zQkNreEJTa2M1U210T1R6RlZXVWhpWlhWZlJFcFRlREptY1d0bWRrdHhSVFYyZDI5TFRqTmxVWEZtWkZseVZIUXdjRzE0U1dsU01VSlhjRTVaWlRkM2JHSTJibGRQYjJjM1pFeE1lSGhIRWhjMlZGbGpXbDkyU0VweGNYRXdMV3RRYkY5bUxUWkJUUm9pUVVaWWNrVmpjVWx0TVRabWFuRTNNRmRwVW0wdGVXeHJTVTVsTTJONllqTndadyIsImZjdiI6IjMiLCJlaSI6IjZUWWNaX3ZISnFxcTAta1BsX2YtNkFNIiwicWMiOiJjLU5TU3k0dEtrck5LMUVvS0VvdHprd0JzZkxURkVveVVoVks4ekpMVWxNVWlrc1NTMUtMQlJnU0dHc2RsTTNzQVEiLCJxdWVzdGlvbiI6IldobyBpcyBudW1iZXIgMSBwcmVzaWRlbnQ%2FIiwibGsiOiJHaGwzYUc4Z2FYTWdiblZ0WW1WeUlERWdjSEpsYzJsa1pXNTAiLCJicyI6ImMtTks1dElMejhoWHlDeFdLTWxJVmNoTExWY29LRW90emt4SnpTdFJ5RThEQzRibVpaYWtwaWdFbHlTV3BCYmJTLXczTTlLVDBpblB5RmZIbzZjVW9xY1lySWNyaGtzTFpFbDVJa1JIWlg1cFhucHFjUWtXcTRJZDdTV09hQmxwUzJtV0U2V2h0RGlSeTRaTEN1cUZ2TkxjcE5RaUJVT0VPbnVKRG1zamFTbkpjbHdLdUR5NEZKRGRabUpla3FGUWxwbWNpbXhHUDd1Um9wUjhPWDVsQW93QSIsImlkIjoiZmNfNlRZY1pfdkhKcXFxMC1rUGxfZi02QU1fMSJ9\"\n },\n {\n \"question\": \"Who was the 47th vice president?\",\n \"snippet\": \"Joseph Robinette Biden, Jr., represented Delaware for 36 years in the U.S. Senate before becoming the 47th and current Vice President of the United States.\",\n \"title\": \"Vice President Joe Biden | The White House\",\n \"link\": \"https://obamawhitehouse.archives.gov/vp#:~:text=Joseph%20Robinette%20Biden%2C%20Jr.%2C,President%20of%20the%20United%20States.\",\n \"displayed_link\": \"https://obamawhitehouse.archives.gov \u203a ...\",\n \"source_logo\": \"https://serpapi.com/searches/671c36e9c4bcf5bca3e80727/images/ad7ee8145e566f1f362fbd875d8257e7cbc15e4c5530eec7b29f28251e20a863.png\",\n \"next_page_token\": \"eyJvbnMiOiIxMDA0MSIsImZjIjoiRW9zQkNreEJTa2M1U210T1R6RlZXVWhpWlhWZlJFcFRlREptY1d0bWRrdHhSVFYyZDI5TFRqTmxVWEZtWkZseVZIUXdjRzE0U1dsU01VSlhjRTVaWlRkM2JHSTJibGRQYjJjM1pFeE1lSGhIRWhjMlZGbGpXbDkyU0VweGNYRXdMV3RRYkY5bUxUWkJUUm9pUVVaWWNrVmpjVWx0TVRabWFuRTNNRmRwVW0wdGVXeHJTVTVsTTJONllqTndadyIsImZjdiI6IjMiLCJlaSI6IjZUWWNaX3ZISnFxcTAta1BsX2YtNkFNIiwicWMiOiJjLU5TU3k0dEtrck5LMUVvS0VvdHprd0JzZkxURkVveVVoVks4ekpMVWxNVWlrc1NTMUtMQlJnU0dHc2RsTTNzQVEiLCJxdWVzdGlvbiI6IldobyB3YXMgdGhlIDQ3dGggdmljZSBwcmVzaWRlbnQ/IiwibGsiOiJHaDkzYUc4Z2QyRnpJSFJvWlNBME4zUm9JSFpwWTJVZ2NISmxjMmxrWlc1MCIsImJzIjoiYy1OSzV0SUx6OGhYeUN4V0tNbElWY2hMTFZjb0tFb3R6a3hKelN0UnlFOERDNGJtWlpha3BpZ0VseVNXcEJiYlMtdzNNOUtUMGluUHlGZkhvNmNVb3FjWXJJY3Joa3NMWkVsNUlrUkhaWDVwWG5wcWNRa1dxNElkN1NXT2FCbHBTMm1XRTZXaHREaVJ5NFpMQ3VxRnZOTGNwTlFpQlVPRU9udUpEbXNqYVNuSmNsd0t1RHk0RkpEZFptSmVrcUZRbHBtY2lteEdQN3VSb3BSOE9YNWxBb3dBIiwiaWQiOiJmY182VFljWl92SEpxcXEwLWtQbF9mLTZBTV8xIn0=\",\n \"serpapi_link\": \"https://serpapi.com/search.json?device=desktop&engine=google_related_questions&google_domain=google.com&next_page_token=eyJvbnMiOiIxMDA0MSIsImZjIjoiRW9zQkNreEJTa2M1U210T1R6RlZXVWhpWlhWZlJFcFRlREptY1d0bWRrdHhSVFYyZDI5TFRqTmxVWEZtWkZseVZIUXdjRzE0U1dsU01VSlhjRTVaWlRkM2JHSTJibGRQYjJjM1pFeE1lSGhIRWhjMlZGbGpXbDkyU0VweGNYRXdMV3RRYkY5bUxUWkJUUm9pUVVaWWNrVmpjVWx0TVRabWFuRTNNRmRwVW0wdGVXeHJTVTVsTTJONllqTndadyIsImZjdiI6IjMiLCJlaSI6IjZUWWNaX3ZISnFxcTAta1BsX2YtNkFNIiwicWMiOiJjLU5TU3k0dEtrck5LMUVvS0VvdHprd0JzZkxURkVveVVoVks4ekpMVWxNVWlrc1NTMUtMQlJnU0dHc2RsTTNzQVEiLCJxdWVzdGlvbiI6IldobyB3YXMgdGhlIDQ3dGggdmljZSBwcmVzaWRlbnQ%2FIiwibGsiOiJHaDkzYUc4Z2QyRnpJSFJvWlNBME4zUm9JSFpwWTJVZ2NISmxjMmxrWlc1MCIsImJzIjoiYy1OSzV0SUx6OGhYeUN4V0tNbElWY2hMTFZjb0tFb3R6a3hKelN0UnlFOERDNGJtWlpha3BpZ0VseVNXcEJiYlMtdzNNOUtUMGluUHlGZkhvNmNVb3FjWXJJY3Joa3NMWkVsNUlrUkhaWDVwWG5wcWNRa1dxNElkN1NXT2FCbHBTMm1XRTZXaHREaVJ5NFpMQ3VxRnZOTGNwTlFpQlVPRU9udUpEbXNqYVNuSmNsd0t1RHk0RkpEZFptSmVrcUZRbHBtY2lteEdQN3VSb3BSOE9YNWxBb3dBIiwiaWQiOiJmY182VFljWl92SEpxcXEwLWtQbF9mLTZBTV8xIn0%3D\"\n }\n ],\n \"answer_box\": {\n \"type\": \"organic_result\",\n \"title\": \"United States \u203a President ShareSend feedbackClose menu\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=United+States&stick=H4sIAAAAAAAAAONgFuLUz9U3sEw2LzdQQjAfMZpwC7z8cU9YSnvSmpPXGFW5uIIz8std80oySyqFxLnYoCxeKW4uhC6eRay8oXmZJakpCsEliSWpxQBxuRz9XwAAAA&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0Q_coHKAB6BAglEAI\",\n \"thumbnail\": \"https://serpapi.com/searches/671c36e9c4bcf5bca3e80727/images/fea807698ab0aaf98cc81ed2a4d632003eaccf0b0c92b22d.jpeg\"\n },\n \"organic_results\": [\n {\n \"position\": 1,\n \"title\": \"Joe Biden: The President\",\n \"link\": \"https://www.whitehouse.gov/administration/president-biden/\",\n \"redirect_link\": \"https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://www.whitehouse.gov/administration/president-biden/&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0QFnoECB0QAQ\",\n \"displayed_link\": \"https://www.whitehouse.gov \u203a administration \u203a presiden...\",\n \"thumbnail\": \"https://serpapi.com/searches/671c36e9c4bcf5bca3e80727/images/0bfbecbf14e47c61b3258776da1d809123675ce52671276e6ec6771c150bee72.jpeg\",\n \"favicon\": \"https://serpapi.com/searches/671c36e9c4bcf5bca3e80727/images/0bfbecbf14e47c61b3258776da1d80910f9b173b72e9eab1601615c1605938de.webp\",\n \"snippet\": \"President Biden represented Delaware for 36 years in the US Senate before becoming the 47th Vice President of the United States.\",\n \"snippet_highlighted_words\": [\n \"President\",\n \"President of the United States\"\n ],\n \"source\": \"The White House (.gov)\"\n },\n {\n \"position\": 2,\n \"title\": \"President of the United States\",\n \"link\": \"https://en.wikipedia.org/wiki/President_of_the_United_States\",\n \"redirect_link\": \"https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://en.wikipedia.org/wiki/President_of_the_United_States&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0QFnoECEkQAQ\",\n \"displayed_link\": \"https://en.wikipedia.org \u203a wiki \u203a President_of_the_Unit...\",\n \"thumbnail\": \"https://serpapi.com/searches/671c36e9c4bcf5bca3e80727/images/0bfbecbf14e47c61b3258776da1d8091fc3a8227d2a2bfb02dc42ab2d1dbfcbe.jpeg\",\n \"favicon\": \"https://serpapi.com/searches/671c36e9c4bcf5bca3e80727/images/0bfbecbf14e47c61b3258776da1d809158e8117e92dd1333a25421ce047e75a9.webp\",\n \"snippet\": \"The president of the United States (POTUS) is the head of state and head of government of the United States of America. The president directs the executive ...\",\n \"snippet_highlighted_words\": [\n \"president of the United States\",\n \"United States\",\n \"president\"\n ],\n \"sitelinks\": {\n \"inline\": [\n {\n \"title\": \"American Presidents\",\n \"link\": \"https://en.wikipedia.org/wiki/List_of_presidents_of_the_United_States\"\n },\n {\n \"title\": \"Powers of the president\",\n \"link\": \"https://en.wikipedia.org/wiki/Powers_of_the_president_of_the_United_States\"\n },\n {\n \"title\": \"Executive Office\",\n \"link\": \"https://en.wikipedia.org/wiki/Executive_Office_of_the_President_of_the_United_States\"\n },\n {\n \"title\": \"Talk\",\n \"link\": \"https://en.wikipedia.org/wiki/President_of_the_United_States_(disambiguation)\"\n }\n ]\n },\n \"source\": \"Wikipedia\"\n },\n {\n \"position\": 3,\n \"title\": \"President of the United States\",\n \"link\": \"https://usun.usmission.gov/our-leaders/the-president-of-the-united-states/\",\n \"redirect_link\": \"https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://usun.usmission.gov/our-leaders/the-president-of-the-united-states/&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0QFnoECEUQAQ\",\n \"displayed_link\": \"https://usun.usmission.gov \u203a Our Leaders\",\n \"favicon\": \"https://serpapi.com/searches/671c36e9c4bcf5bca3e80727/images/0bfbecbf14e47c61b3258776da1d8091121c5487a8779ef9f7acea7b19505bc8.webp\",\n \"snippet\": \"President Biden represented Delaware for 36 years in the US Senate before becoming the 47th Vice President of the United States.\",\n \"snippet_highlighted_words\": [\n \"President\",\n \"President of the United States\"\n ],\n \"source\": \"United States Mission to the United Nations (.gov)\"\n },\n {\n \"position\": 4,\n \"title\": \"The Executive Branch\",\n \"link\": \"https://www.whitehouse.gov/about-the-white-house/our-government/the-executive-branch/\",\n \"redirect_link\": \"https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://www.whitehouse.gov/about-the-white-house/our-government/the-executive-branch/&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0QFnoECEYQAQ\",\n \"displayed_link\": \"https://www.whitehouse.gov \u203a ... \u203a Our Government\",\n \"favicon\": \"https://serpapi.com/searches/671c36e9c4bcf5bca3e80727/images/0bfbecbf14e47c61b3258776da1d8091ad45f5dadf4a42654be2bc1d744225aa.webp\",\n \"snippet\": \"From the President, to the Vice President, to the Cabinet, learn more about the Executive Branch of the government of the United States.\",\n \"snippet_highlighted_words\": [\n \"President\",\n \"President\",\n \"United States\"\n ],\n \"source\": \"The White House (.gov)\"\n },\n {\n \"position\": 5,\n \"title\": \"potus - President Joe Biden\",\n \"link\": \"https://www.instagram.com/potus/?hl=en\",\n \"redirect_link\": \"https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://www.instagram.com/potus/%3Fhl%3Den&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0QFnoECEoQAQ\",\n \"displayed_link\": \"19.1M+ followers\",\n \"favicon\": \"https://serpapi.com/searches/671c36e9c4bcf5bca3e80727/images/0bfbecbf14e47c61b3258776da1d80918c36147c96afe6855fcd63f1ec9e9f13.webp\",\n \"snippet\": \"19M Followers, 5 Following, 4491 Posts - President Joe Biden (@potus) on Instagram: \\\"46th President of the United States, husband to @flotus ...\",\n \"snippet_highlighted_words\": [\n \"President\",\n \"President of the United States\"\n ],\n \"source\": \"Instagram \u00b7 potus\"\n },\n {\n \"position\": 6,\n \"title\": \"Presidents, vice presidents, and first ladies\",\n \"link\": \"https://www.usa.gov/presidents\",\n \"redirect_link\": \"https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://www.usa.gov/presidents&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0QFnoECEQQAQ\",\n \"displayed_link\": \"https://www.usa.gov \u203a ... \u203a U.S. facts and figures\",\n \"favicon\": \"https://serpapi.com/searches/671c36e9c4bcf5bca3e80727/images/0bfbecbf14e47c61b3258776da1d8091d2def812f73ab4a461c4ccb1a6f18154.webp\",\n \"date\": \"Sep 20, 2024\",\n \"snippet\": \"Learn about the duties of the U.S. president, vice president, and first lady. Find out how to contact and learn more about current and past ...\",\n \"snippet_highlighted_words\": [\n \"U.S. president\",\n \"president\",\n \"current\"\n ],\n \"source\": \"USA.gov\"\n },\n {\n \"position\": 7,\n \"title\": \"Joe Biden\",\n \"link\": \"https://en.wikipedia.org/wiki/Joe_Biden\",\n \"redirect_link\": \"https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://en.wikipedia.org/wiki/Joe_Biden&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0QFnoECEMQAQ\",\n \"displayed_link\": \"https://en.wikipedia.org \u203a wiki \u203a Joe_Biden\",\n \"favicon\": \"https://serpapi.com/searches/671c36e9c4bcf5bca3e80727/images/0bfbecbf14e47c61b3258776da1d8091707d8df4bff108102635656d2baac128.webp\",\n \"snippet\": \"Joseph Robinette Biden Jr. (born November 20, 1942) is an American politician who has been the 46th and current president of the United States since 2021.\",\n \"snippet_highlighted_words\": [\n \"current president of the United States\"\n ],\n \"source\": \"Wikipedia\"\n },\n {\n \"position\": 8,\n \"title\": \"Joe Biden's Path to the United States Presidency\",\n \"link\": \"https://www.britannica.com/video/who-is-President-Joe-Biden/-261012\",\n \"displayed_link\": \"https://www.britannica.com \u203a who-is-President-Joe-Biden\",\n \"thumbnail\": \"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTBA5esZeOMzKNwtbAdAAGDKnIzwZu8OaAUEdHwYIqlx8lK&s\",\n \"favicon\": \"https://serpapi.com/searches/671c36e9c4bcf5bca3e80727/images/0bfbecbf14e47c61b3258776da1d809144cacfc2f26d14a73b65e5227ec342ec.png\",\n \"date\": \"Jan 7, 2022\",\n \"snippet\": \"Learn more about the life and career of Joe Biden, the 46th president of the United States.\",\n \"duration\": \"2:21\",\n \"rich_snippet\": {\n \"top\": {\n \"detected_extensions\": {\n \"date\": \"Jan 7, 2022\"\n },\n \"extensions\": [\n \"Britannica\",\n \"Jan 7, 2022\"\n ]\n }\n },\n \"video_link\": \"https://encrypted-vtbn0.gstatic.com/video?q=tbn:ANd9GcROuAdejw5zIuel829Yg2a-WcElSEWdOPVjSg\",\n \"source\": \"Britannica\"\n },\n {\n \"position\": 9,\n \"title\": \"President of the United States\",\n \"link\": \"https://ballotpedia.org/President_of_the_United_States\",\n \"redirect_link\": \"https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://ballotpedia.org/President_of_the_United_States&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0QFnoECEgQAQ\",\n \"displayed_link\": \"https://ballotpedia.org \u203a President_of_the_United_States\",\n \"favicon\": \"https://serpapi.com/searches/671c36e9c4bcf5bca3e80727/images/0bfbecbf14e47c61b3258776da1d8091086f5f0710fc4ac6a767cc31b14513b3.webp\",\n \"snippet\": \"Article II of the U.S. Constitution laid out the requirements and roles of the president. The current president is Joe Biden (D). Election requirements.\",\n \"snippet_highlighted_words\": [\n \"U.S.\",\n \"president\",\n \"current president\"\n ],\n \"source\": \"Ballotpedia\"\n },\n {\n \"position\": 10,\n \"title\": \"Joe Biden | Biography, Family, Policies, & Facts\",\n \"link\": \"https://www.britannica.com/biography/Joe-Biden\",\n \"redirect_link\": \"https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://www.britannica.com/biography/Joe-Biden&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0QFnoECEcQAQ\",\n \"displayed_link\": \"https://www.britannica.com \u203a biography \u203a Joe-Biden\",\n \"thumbnail\": \"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTxhWTZ_S1u-RWVui7B5-A5hg0buAteg-_4DunMq0df1kbaloT2vIDX&usqp=CAE&s\",\n \"favicon\": \"https://serpapi.com/searches/671c36e9c4bcf5bca3e80727/images/0bfbecbf14e47c61b3258776da1d80916b88fa1cdd7b20092d43d06af230b264.webp\",\n \"date\": \"Oct 7, 2024\",\n \"snippet\": \"Joe Biden, the 46th president of the United States, brings decades of political experience and a commitment to unity as he leads America ...\",\n \"snippet_highlighted_words\": [\n \"president of the United States\"\n ],\n \"source\": \"Britannica\"\n }\n ],\n \"related_searches\": [\n {\n \"block_position\": 1,\n \"query\": \"Who is the Vice President of the United States\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=Who+is+the+Vice+President+of+the+United+States&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0Q1QJ6BAhoEAE\",\n \"serpapi_link\": \"https://serpapi.com/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=Who+is+the+Vice+President+of+the+United+States\"\n },\n {\n \"block_position\": 1,\n \"query\": \"Who is the 46th president\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=Who+is+the+46th+president&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0Q1QJ6BAhnEAE\",\n \"serpapi_link\": \"https://serpapi.com/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=Who+is+the+46th+president\"\n },\n {\n \"block_position\": 1,\n \"query\": \"47th President of the United States\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=47th+President+of+the+United+States&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0Q1QJ6BAhmEAE\",\n \"serpapi_link\": \"https://serpapi.com/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=47th+President+of+the+United+States\"\n },\n {\n \"block_position\": 1,\n \"query\": \"48th President of the United States\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=48th+President+of+the+United+States&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0Q1QJ6BAhjEAE\",\n \"serpapi_link\": \"https://serpapi.com/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=48th+President+of+the+United+States\"\n },\n {\n \"block_position\": 1,\n \"query\": \"All Presidents in order\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=All+Presidents+in+order&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0Q1QJ6BAhkEAE\",\n \"serpapi_link\": \"https://serpapi.com/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=All+Presidents+in+order\"\n },\n {\n \"block_position\": 1,\n \"query\": \"Who is the New President of the United States\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=Who+is+the+New+President+of+the+United+States&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0Q1QJ6BAhlEAE\",\n \"serpapi_link\": \"https://serpapi.com/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=Who+is+the+New+President+of+the+United+States\"\n },\n {\n \"block_position\": 1,\n \"query\": \"Joe Biden age\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=Joe+Biden+age&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0Q1QJ6BAhhEAE\",\n \"serpapi_link\": \"https://serpapi.com/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=Joe+Biden+age\"\n },\n {\n \"block_position\": 1,\n \"query\": \"Is Joe Biden still president\",\n \"link\": \"https://www.google.com/search?sca_esv=1e2149b22db2c846&q=Is+Joe+Biden+still+president&sa=X&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0Q1QJ6BAhiEAE\",\n \"serpapi_link\": \"https://serpapi.com/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=Is+Joe+Biden+still+president\"\n }\n ],\n \"pagination\": {\n \"current\": 1,\n \"next\": \"https://www.google.com/search?q=current+president+of+the+United+States&sca_esv=1e2149b22db2c846&ei=6TYcZ_vHJqqq0-kPl_f-6AM&start=10&sa=N&sstk=Aagrsug7oGd4B5M7G-HtkM6PI2bTcUwyO9ISHo6E25sUrUPiKsu0y-kZeqHP5kc_9Q84hVSSZUs4FrQJeOC9cz7GfBvB521_P_B1dw&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0Q8NMDegQIBhAW\",\n \"other_pages\": {\n \"2\": \"https://www.google.com/search?q=current+president+of+the+United+States&sca_esv=1e2149b22db2c846&ei=6TYcZ_vHJqqq0-kPl_f-6AM&start=10&sa=N&sstk=Aagrsug7oGd4B5M7G-HtkM6PI2bTcUwyO9ISHo6E25sUrUPiKsu0y-kZeqHP5kc_9Q84hVSSZUs4FrQJeOC9cz7GfBvB521_P_B1dw&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0Q8tMDegQIBhAE\",\n \"3\": \"https://www.google.com/search?q=current+president+of+the+United+States&sca_esv=1e2149b22db2c846&ei=6TYcZ_vHJqqq0-kPl_f-6AM&start=20&sa=N&sstk=Aagrsug7oGd4B5M7G-HtkM6PI2bTcUwyO9ISHo6E25sUrUPiKsu0y-kZeqHP5kc_9Q84hVSSZUs4FrQJeOC9cz7GfBvB521_P_B1dw&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0Q8tMDegQIBhAG\",\n \"4\": \"https://www.google.com/search?q=current+president+of+the+United+States&sca_esv=1e2149b22db2c846&ei=6TYcZ_vHJqqq0-kPl_f-6AM&start=30&sa=N&sstk=Aagrsug7oGd4B5M7G-HtkM6PI2bTcUwyO9ISHo6E25sUrUPiKsu0y-kZeqHP5kc_9Q84hVSSZUs4FrQJeOC9cz7GfBvB521_P_B1dw&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0Q8tMDegQIBhAI\",\n \"5\": \"https://www.google.com/search?q=current+president+of+the+United+States&sca_esv=1e2149b22db2c846&ei=6TYcZ_vHJqqq0-kPl_f-6AM&start=40&sa=N&sstk=Aagrsug7oGd4B5M7G-HtkM6PI2bTcUwyO9ISHo6E25sUrUPiKsu0y-kZeqHP5kc_9Q84hVSSZUs4FrQJeOC9cz7GfBvB521_P_B1dw&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0Q8tMDegQIBhAK\",\n \"6\": \"https://www.google.com/search?q=current+president+of+the+United+States&sca_esv=1e2149b22db2c846&ei=6TYcZ_vHJqqq0-kPl_f-6AM&start=50&sa=N&sstk=Aagrsug7oGd4B5M7G-HtkM6PI2bTcUwyO9ISHo6E25sUrUPiKsu0y-kZeqHP5kc_9Q84hVSSZUs4FrQJeOC9cz7GfBvB521_P_B1dw&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0Q8tMDegQIBhAM\",\n \"7\": \"https://www.google.com/search?q=current+president+of+the+United+States&sca_esv=1e2149b22db2c846&ei=6TYcZ_vHJqqq0-kPl_f-6AM&start=60&sa=N&sstk=Aagrsug7oGd4B5M7G-HtkM6PI2bTcUwyO9ISHo6E25sUrUPiKsu0y-kZeqHP5kc_9Q84hVSSZUs4FrQJeOC9cz7GfBvB521_P_B1dw&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0Q8tMDegQIBhAO\",\n \"8\": \"https://www.google.com/search?q=current+president+of+the+United+States&sca_esv=1e2149b22db2c846&ei=6TYcZ_vHJqqq0-kPl_f-6AM&start=70&sa=N&sstk=Aagrsug7oGd4B5M7G-HtkM6PI2bTcUwyO9ISHo6E25sUrUPiKsu0y-kZeqHP5kc_9Q84hVSSZUs4FrQJeOC9cz7GfBvB521_P_B1dw&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0Q8tMDegQIBhAQ\",\n \"9\": \"https://www.google.com/search?q=current+president+of+the+United+States&sca_esv=1e2149b22db2c846&ei=6TYcZ_vHJqqq0-kPl_f-6AM&start=80&sa=N&sstk=Aagrsug7oGd4B5M7G-HtkM6PI2bTcUwyO9ISHo6E25sUrUPiKsu0y-kZeqHP5kc_9Q84hVSSZUs4FrQJeOC9cz7GfBvB521_P_B1dw&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0Q8tMDegQIBhAS\",\n \"10\": \"https://www.google.com/search?q=current+president+of+the+United+States&sca_esv=1e2149b22db2c846&ei=6TYcZ_vHJqqq0-kPl_f-6AM&start=90&sa=N&sstk=Aagrsug7oGd4B5M7G-HtkM6PI2bTcUwyO9ISHo6E25sUrUPiKsu0y-kZeqHP5kc_9Q84hVSSZUs4FrQJeOC9cz7GfBvB521_P_B1dw&ved=2ahUKEwi74Jmn5KqJAxUq1TQHHZe7Hz0Q8tMDegQIBhAU\"\n }\n },\n \"serpapi_pagination\": {\n \"current\": 1,\n \"next_link\": \"https://serpapi.com/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=current+president+of+the+United+States&start=10\",\n \"next\": \"https://serpapi.com/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=current+president+of+the+United+States&start=10\",\n \"other_pages\": {\n \"2\": \"https://serpapi.com/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=current+president+of+the+United+States&start=10\",\n \"3\": \"https://serpapi.com/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=current+president+of+the+United+States&start=20\",\n \"4\": \"https://serpapi.com/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=current+president+of+the+United+States&start=30\",\n \"5\": \"https://serpapi.com/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=current+president+of+the+United+States&start=40\",\n \"6\": \"https://serpapi.com/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=current+president+of+the+United+States&start=50\",\n \"7\": \"https://serpapi.com/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=current+president+of+the+United+States&start=60\",\n \"8\": \"https://serpapi.com/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=current+president+of+the+United+States&start=70\",\n \"9\": \"https://serpapi.com/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=current+president+of+the+United+States&start=80\",\n \"10\": \"https://serpapi.com/search.json?device=desktop&engine=google&google_domain=google.com&num=10&q=current+president+of+the+United+States&start=90\"\n }\n }\n}" +} diff --git a/tests/Tools/SerpAPIGoogleNewsToolTest.php b/tests/Tools/SerpAPIGoogleNewsToolTest.php index 91240fc..0cab560 100644 --- a/tests/Tools/SerpAPIGoogleNewsToolTest.php +++ b/tests/Tools/SerpAPIGoogleNewsToolTest.php @@ -2,26 +2,24 @@ declare(strict_types=1); - use Saloon\Http\Faking\Fixture; - use Saloon\Http\Faking\MockClient; - use Saloon\Http\Faking\MockResponse; - use Saloon\Http\PendingRequest; - use UseTheFork\Synapse\Agent; - use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; - use UseTheFork\Synapse\Contracts\Integration; - use UseTheFork\Synapse\Contracts\Memory; - use UseTheFork\Synapse\Contracts\Tool; - use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; - use UseTheFork\Synapse\Integrations\OpenAIIntegration; - use UseTheFork\Synapse\Memory\CollectionMemory; - use UseTheFork\Synapse\Services\SerpApi\Requests\SerpApiSearchRequest; - use UseTheFork\Synapse\Tools\BaseTool; - use UseTheFork\Synapse\Tools\Search\SerpAPIGoogleNewsTool; - use UseTheFork\Synapse\Tools\Search\SerpAPIGoogleSearchTool; - use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; - use UseTheFork\Synapse\ValueObject\SchemaRule; - - test('Serp API Google News Tool', function (): void { + use Saloon\Http\Faking\MockClient; + use Saloon\Http\Faking\MockResponse; + use Saloon\Http\PendingRequest; + use UseTheFork\Synapse\Agent; + use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; + use UseTheFork\Synapse\Contracts\Integration; + use UseTheFork\Synapse\Contracts\Tool; + use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; + use UseTheFork\Synapse\Integrations\OpenAIIntegration; + use UseTheFork\Synapse\Services\SerpApi\Requests\SerpApiSearchRequest; + use UseTheFork\Synapse\Tests\Fixtures\OpenAi\OpenAiFixture; + use UseTheFork\Synapse\Tools\BaseTool; + use UseTheFork\Synapse\Tools\Search\SerpAPIGoogleNewsTool; + use UseTheFork\Synapse\Tools\Search\SerpAPIGoogleSearchTool; + use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; + use UseTheFork\Synapse\ValueObject\SchemaRule; + + test('Serp API Google News Tool', function (): void { class SerpAPIGoogleNewsToolTestAgent extends Agent implements HasOutputSchema { @@ -34,11 +32,6 @@ public function resolveIntegration(): Integration return new OpenAIIntegration; } - public function resolveMemory(): Memory - { - return new CollectionMemory; - } - public function resolveOutputSchema(): array { return [ @@ -57,10 +50,9 @@ protected function resolveTools(): array } MockClient::global([ - ChatRequest::class => function (PendingRequest $pendingRequest): Fixture { + ChatRequest::class => function (PendingRequest $pendingRequest): OpenAiFixture { $hash = md5(json_encode($pendingRequest->body()->get('messages'))); - - return MockResponse::fixture("Tools/SerpAPIGoogleNewsTool-{$hash}"); + return new OpenAiFixture("Tools/SerpAPIGoogleNewsTool-{$hash}"); }, SerpApiSearchRequest::class => MockResponse::fixture('Tools/SerpAPIGoogleNewsTool-Tool'), ]); @@ -71,7 +63,7 @@ protected function resolveTools(): array $agentResponseArray = $message->toArray(); expect($agentResponseArray['content'])->toBeArray() ->and($agentResponseArray['content'])->toHaveKey('answer') - ->and($agentResponseArray['content']['answer'])->toContain("Current headlines about Apple include news about potential discontinuation of some products, sales predictions for the iPhone 16 series based on Apple Intelligence"); + ->and($agentResponseArray['content']['answer'])->toContain("1. Is Apple Stock A Buy Before September-Quarter Earnings?"); }); diff --git a/tests/Tools/SerpAPIGoogleSearchToolTest.php b/tests/Tools/SerpAPIGoogleSearchToolTest.php index cf3ed93..fb61d83 100644 --- a/tests/Tools/SerpAPIGoogleSearchToolTest.php +++ b/tests/Tools/SerpAPIGoogleSearchToolTest.php @@ -2,25 +2,23 @@ declare(strict_types=1); - use Saloon\Http\Faking\Fixture; - use Saloon\Http\Faking\MockClient; - use Saloon\Http\Faking\MockResponse; - use Saloon\Http\PendingRequest; - use UseTheFork\Synapse\Agent; - use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; - use UseTheFork\Synapse\Contracts\Integration; - use UseTheFork\Synapse\Contracts\Memory; - use UseTheFork\Synapse\Contracts\Tool; - use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; - use UseTheFork\Synapse\Integrations\OpenAIIntegration; - use UseTheFork\Synapse\Memory\CollectionMemory; - use UseTheFork\Synapse\Services\SerpApi\Requests\SerpApiSearchRequest; - use UseTheFork\Synapse\Tools\BaseTool; - use UseTheFork\Synapse\Tools\Search\SerpAPIGoogleSearchTool; - use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; - use UseTheFork\Synapse\ValueObject\SchemaRule; - - test('Serp API Tool', function (): void { + use Saloon\Http\Faking\MockClient; + use Saloon\Http\Faking\MockResponse; + use Saloon\Http\PendingRequest; + use UseTheFork\Synapse\Agent; + use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; + use UseTheFork\Synapse\Contracts\Integration; + use UseTheFork\Synapse\Contracts\Tool; + use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; + use UseTheFork\Synapse\Integrations\OpenAIIntegration; + use UseTheFork\Synapse\Services\SerpApi\Requests\SerpApiSearchRequest; + use UseTheFork\Synapse\Tests\Fixtures\OpenAi\OpenAiFixture; + use UseTheFork\Synapse\Tools\BaseTool; + use UseTheFork\Synapse\Tools\Search\SerpAPIGoogleSearchTool; + use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; + use UseTheFork\Synapse\ValueObject\SchemaRule; + + test('Serp API Tool', function (): void { class SerpAPIGoogleSearchToolTestAgent extends Agent implements HasOutputSchema { @@ -33,11 +31,6 @@ public function resolveIntegration(): Integration return new OpenAIIntegration; } - public function resolveMemory(): Memory - { - return new CollectionMemory; - } - public function resolveOutputSchema(): array { return [ @@ -56,10 +49,10 @@ protected function resolveTools(): array } MockClient::global([ - ChatRequest::class => function (PendingRequest $pendingRequest): Fixture { + ChatRequest::class => function (PendingRequest $pendingRequest): OpenAiFixture { $hash = md5(json_encode($pendingRequest->body()->get('messages'))); - return MockResponse::fixture("Tools/SerpAPIGoogleSearchTool-{$hash}"); + return new OpenAiFixture("Tools/SerpAPIGoogleSearchTool-{$hash}"); }, SerpApiSearchRequest::class => MockResponse::fixture('Tools/SerpAPIGoogleSearchTool-Tool'), ]); From ddfc3f7c9d34fc9f6915642b0913493ab58a377d Mon Sep 17 00:00:00 2001 From: use-the-fork Date: Tue, 11 Mar 2025 19:25:49 -0400 Subject: [PATCH 6/7] feat: Rename agent memory and messages tables to synapse_agent_memories and synapse_messages --- ...07_06_132316_create_agent_memory_table.php | 14 +-- ...024_07_06_132319_create_messages_table.php | 14 +-- flake.lock | 98 ++++++++----------- flake.nix | 1 + src/Memory/DatabaseMemory.php | 2 +- src/Models/AgentMemory.php | 1 + src/Models/Message.php | 9 +- src/Traits/Agent/LogsAgentActivity.php | 20 ++-- src/Traits/Agent/ManagesMemory.php | 20 +--- tests/AgentChains/RatAgentChainTest.php | 26 ++--- tests/Agents/ChatRephraseAgentTest.php | 20 ++-- ...textualRetrievalPreprocessingAgentTest.php | 2 +- tests/Agents/ImageAgentTest.php | 24 ++--- .../KnowledgeGraphExtractionAgentTest.php | 26 ----- tests/Agents/MultiQueryRetrieverAgentTest.php | 14 +-- tests/Agents/SQLToolAgentTest.php | 16 +-- ...isan-45fd717294d9994835af091e62465560.json | 10 ++ ...isan-9de9d17283d00e1b029790c472e08b72.json | 10 ++ ...mory-2b5f90ae806afa53a979306da93d9e84.json | 31 ++++++ ...mory-dfff118fdeea050656d98836a66f4f01.json | 31 ++++++ ...gent-4d99e66b29cfdc8b1693e0ccf1306612.json | 10 ++ ...gent-4de6d484520d502d2ee2f7cfc8d03616.json | 10 ++ ...gent-5bb9375587f60ab90598e4e35ef208bb.json | 10 ++ ...gent-bf2f932a9607c7432e73ab858d97f0a4.json | 10 ++ ...gent-32ae472286b057df708d31ea881cb283.json | 10 ++ ...gent-560e8c18c3ee1995f229f46dd73dcc33.json | 10 ++ ...gent-7ad11bd7dd13649bbf0c0ee2f8935881.json | 10 ++ ...gent-8afadb44cc44e4a50f20f3cbfa927732.json | 10 ++ ...Tool-37a6259cc0c1dae299a7866489dff0bd.json | 10 ++ ...gent-fd244ad8f44fd521474d587db86ae4c7.json | 10 ++ ...mory-472476cf0424ea3af72057915e207478.json | 31 ++++++ ...mory-d8ef1e6148a4a1a85e9d5d0f11254784.json | 31 ++++++ ...gent-32010a33b3c9a74d727fd084d741b723.json | 10 ++ ...gent-66d1e5c81c777310402eeedcac4d9854.json | 10 ++ ...gent-abf1d4c9a9f535c0fbcb9eff86e94f08.json | 10 ++ ...gent-c3e01ea6bb2c55897054959716fc7d4b.json | 10 ++ ...gent-c739a365fead056b4056318d93427f1f.json | 10 ++ ...gent-39bc17d178807a04cb3b9318f2573b99.json | 10 ++ ...gent-46dc2f6885dcaf33d1f51f9d37f74b0e.json | 10 ++ ...gent-5f5602e2afd0c53f0a77b94e1ee969b7.json | 10 ++ ...gent-c532fd169e50d3c682b283b7a9c67cf3.json | 10 ++ tests/Memory/CollectionMemoryTest.php | 10 +- .../Memory/ConversationSummaryMemoryTest.php | 50 +++++----- tests/Memory/DatabaseMemoryTest.php | 8 +- tests/Tools/SQLToolTest.php | 2 +- 45 files changed, 494 insertions(+), 217 deletions(-) delete mode 100644 tests/Agents/KnowledgeGraphExtractionAgentTest.php create mode 100644 tests/Fixtures/Saloon/Console/SynapseArtisan-45fd717294d9994835af091e62465560.json create mode 100644 tests/Fixtures/Saloon/Console/SynapseArtisan-9de9d17283d00e1b029790c472e08b72.json create mode 100644 tests/Fixtures/Saloon/Memory/CollectionMemory-2b5f90ae806afa53a979306da93d9e84.json create mode 100644 tests/Fixtures/Saloon/Memory/CollectionMemory-dfff118fdeea050656d98836a66f4f01.json create mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-4d99e66b29cfdc8b1693e0ccf1306612.json create mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-4de6d484520d502d2ee2f7cfc8d03616.json create mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-5bb9375587f60ab90598e4e35ef208bb.json create mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-bf2f932a9607c7432e73ab858d97f0a4.json create mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-32ae472286b057df708d31ea881cb283.json create mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-560e8c18c3ee1995f229f46dd73dcc33.json create mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-7ad11bd7dd13649bbf0c0ee2f8935881.json create mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-8afadb44cc44e4a50f20f3cbfa927732.json create mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-Tool-37a6259cc0c1dae299a7866489dff0bd.json create mode 100644 tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-fd244ad8f44fd521474d587db86ae4c7.json create mode 100644 tests/Fixtures/Saloon/Memory/DatabaseMemory-472476cf0424ea3af72057915e207478.json create mode 100644 tests/Fixtures/Saloon/Memory/DatabaseMemory-d8ef1e6148a4a1a85e9d5d0f11254784.json create mode 100644 tests/Fixtures/Saloon/Tools/SQLTestAgent-32010a33b3c9a74d727fd084d741b723.json create mode 100644 tests/Fixtures/Saloon/Tools/SQLTestAgent-66d1e5c81c777310402eeedcac4d9854.json create mode 100644 tests/Fixtures/Saloon/Tools/SQLTestAgent-abf1d4c9a9f535c0fbcb9eff86e94f08.json create mode 100644 tests/Fixtures/Saloon/Tools/SQLTestAgent-c3e01ea6bb2c55897054959716fc7d4b.json create mode 100644 tests/Fixtures/Saloon/Tools/SQLTestAgent-c739a365fead056b4056318d93427f1f.json create mode 100644 tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-39bc17d178807a04cb3b9318f2573b99.json create mode 100644 tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-46dc2f6885dcaf33d1f51f9d37f74b0e.json create mode 100644 tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-5f5602e2afd0c53f0a77b94e1ee969b7.json create mode 100644 tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-c532fd169e50d3c682b283b7a9c67cf3.json diff --git a/database/migrations/2024_07_06_132316_create_agent_memory_table.php b/database/migrations/2024_07_06_132316_create_agent_memory_table.php index 2f28658..c25dc9a 100644 --- a/database/migrations/2024_07_06_132316_create_agent_memory_table.php +++ b/database/migrations/2024_07_06_132316_create_agent_memory_table.php @@ -2,17 +2,17 @@ declare(strict_types=1); //Credits to https://github.com/bootstrapguru/dexor -use Illuminate\Database\Migrations\Migration; -use Illuminate\Database\Schema\Blueprint; -use Illuminate\Support\Facades\Schema; + use Illuminate\Database\Migrations\Migration; + use Illuminate\Database\Schema\Blueprint; + use Illuminate\Support\Facades\Schema; -return new class extends Migration + return new class extends Migration { public function up(): void { - Schema::create('agent_memories', function (Blueprint $table) { + Schema::create('synapse_agent_memories', function (Blueprint $table) { - $table->uuid('id'); + $table->uuid('id')->primary(); $table->string('type')->nullable(); $table->timestamps(); }); @@ -20,6 +20,6 @@ public function up(): void public function down(): void { - Schema::dropIfExists('agents'); + Schema::dropIfExists('synapse_agent_memories'); } }; diff --git a/database/migrations/2024_07_06_132319_create_messages_table.php b/database/migrations/2024_07_06_132319_create_messages_table.php index 8e6a05f..d3e529a 100644 --- a/database/migrations/2024_07_06_132319_create_messages_table.php +++ b/database/migrations/2024_07_06_132319_create_messages_table.php @@ -2,17 +2,17 @@ declare(strict_types=1); //Credits to https://github.com/bootstrapguru/dexor -use Illuminate\Database\Migrations\Migration; -use Illuminate\Database\Schema\Blueprint; -use Illuminate\Support\Facades\Schema; + use Illuminate\Database\Migrations\Migration; + use Illuminate\Database\Schema\Blueprint; + use Illuminate\Support\Facades\Schema; -return new class extends Migration + return new class extends Migration { public function up(): void { - Schema::create('messages', function (Blueprint $table) { + Schema::create('synapse_messages', function (Blueprint $table) { $table->id(); - $table->foreignUuid('agent_memory_id')->constrained('agent_memories')->onDelete('cascade'); + $table->foreignUuid('agent_memory_id')->constrained('synapse_agent_memories')->onDelete('cascade'); $table->string('role'); $table->text('content')->nullable(); $table->string('tool_name')->nullable(); @@ -26,6 +26,6 @@ public function up(): void public function down(): void { - Schema::dropIfExists('messages'); + Schema::dropIfExists('synapse_messages'); } }; diff --git a/flake.lock b/flake.lock index 97e2f7c..b80007d 100644 --- a/flake.lock +++ b/flake.lock @@ -8,11 +8,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1720546205, - "narHash": "sha256-boCXsjYVxDviyzoEyAk624600f3ZBo/DKtUdvMTpbGY=", + "lastModified": 1736955230, + "narHash": "sha256-uenf8fv2eG5bKM8C/UvFaiJMZ4IpUFaQxk9OH5t/1gA=", "owner": "ryantm", "repo": "agenix", - "rev": "de96bd907d5fbc3b14fc33ad37d1b9a3cb15edc6", + "rev": "e600439ec4c273cf11e06fe4d9d906fb98fa097c", "type": "github" }, "original": { @@ -65,11 +65,11 @@ "nixpkgs-lib": "nixpkgs-lib" }, "locked": { - "lastModified": 1722555600, - "narHash": "sha256-XOQkdLafnb/p9ij77byFQjDf5m5QYl9b2REiVClC+x4=", + "lastModified": 1741352980, + "narHash": "sha256-+u2UunDA4Cl5Fci3m7S643HzKmIDAe+fiXrLqYsR2fs=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "8471fe90ad337a8074e957b69ca4d0089218391d", + "rev": "f4330d22f1c5d2ba72d3d22df5597d123fdb60a9", "type": "github" }, "original": { @@ -86,11 +86,11 @@ ] }, "locked": { - "lastModified": 1719994518, - "narHash": "sha256-pQMhCCHyQGRzdfAkdJ4cIWiw+JNuWsTX7f0ZYSyz0VY=", + "lastModified": 1740872218, + "narHash": "sha256-ZaMw0pdoUKigLpv9HiNDH2Pjnosg7NBYMJlHTIsHEUo=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "9227223f6d922fee3c7b190b2cc238a99527bbb7", + "rev": "3876f6b87db82f33775b1ef5ea343986105db764", "type": "github" }, "original": { @@ -101,11 +101,11 @@ }, "flake-root": { "locked": { - "lastModified": 1713493429, - "narHash": "sha256-ztz8JQkI08tjKnsTpfLqzWoKFQF4JGu2LRz8bkdnYUk=", + "lastModified": 1723604017, + "narHash": "sha256-rBtQ8gg+Dn4Sx/s+pvjdq3CB2wQNzx9XGFq/JVGCB6k=", "owner": "srid", "repo": "flake-root", - "rev": "bc748b93b86ee76e2032eecda33440ceb2532fcd", + "rev": "b759a56851e10cb13f6b8e5698af7b59c44be26e", "type": "github" }, "original": { @@ -196,15 +196,14 @@ "nixpkgs": [ "snow-blower", "nixpkgs" - ], - "nixpkgs-stable": "nixpkgs-stable" + ] }, "locked": { - "lastModified": 1721042469, - "narHash": "sha256-6FPUl7HVtvRHCCBQne7Ylp4p+dpP3P/OYuzjztZ4s70=", + "lastModified": 1740915799, + "narHash": "sha256-JvQvtaphZNmeeV+IpHgNdiNePsIpHD5U/7QN5AeY44A=", "owner": "cachix", "repo": "pre-commit-hooks.nix", - "rev": "f451c19376071a90d8c58ab1a953c6e9840527fd", + "rev": "42b1ba089d2034d910566bf6b40830af6b8ec732", "type": "github" }, "original": { @@ -384,11 +383,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1722813957, - "narHash": "sha256-IAoYyYnED7P8zrBFMnmp7ydaJfwTnwcnqxUElC1I26Y=", + "lastModified": 1741513245, + "narHash": "sha256-7rTAMNTY1xoBwz0h7ZMtEcd8LELk9R5TzBPoHuhNSCk=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "cb9a96f23c491c081b38eab96d22fa958043c9fa", + "rev": "e3e32b642a31e6714ec1b712de8c91a3352ce7e1", "type": "github" }, "original": { @@ -400,29 +399,16 @@ }, "nixpkgs-lib": { "locked": { - "lastModified": 1722555339, - "narHash": "sha256-uFf2QeW7eAHlYXuDktm9c25OxOyCoUOQmh5SZ9amE5Q=", - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs/archive/a5d394176e64ab29c852d03346c1fc9b0b7d33eb.tar.gz" - }, - "original": { - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs/archive/a5d394176e64ab29c852d03346c1fc9b0b7d33eb.tar.gz" - } - }, - "nixpkgs-stable": { - "locked": { - "lastModified": 1720386169, - "narHash": "sha256-NGKVY4PjzwAa4upkGtAMz1npHGoRzWotlSnVlqI40mo=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "194846768975b7ad2c4988bdb82572c00222c0d7", + "lastModified": 1740877520, + "narHash": "sha256-oiwv/ZK/2FhGxrCkQkB83i7GnWXPPLzoqFHpDD3uYpk=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "147dee35aab2193b174e4c0868bd80ead5ce755c", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixos-24.05", - "repo": "nixpkgs", + "owner": "nix-community", + "repo": "nixpkgs.lib", "type": "github" } }, @@ -444,11 +430,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1722062969, - "narHash": "sha256-QOS0ykELUmPbrrUGmegAUlpmUFznDQeR4q7rFhl8eQg=", + "lastModified": 1741173522, + "narHash": "sha256-k7VSqvv0r1r53nUI/IfPHCppkUAddeXn843YlAC5DR0=", "owner": "nixos", "repo": "nixpkgs", - "rev": "b73c2221a46c13557b1b3be9c2070cc42cf01eb3", + "rev": "d69ab0d71b22fa1ce3dbeff666e6deb4917db049", "type": "github" }, "original": { @@ -460,27 +446,27 @@ }, "nixpkgs_4": { "locked": { - "lastModified": 1720957393, - "narHash": "sha256-oedh2RwpjEa+TNxhg5Je9Ch6d3W1NKi7DbRO1ziHemA=", + "lastModified": 1735554305, + "narHash": "sha256-zExSA1i/b+1NMRhGGLtNfFGXgLtgo+dcuzHzaWA6w3Q=", "owner": "nixos", "repo": "nixpkgs", - "rev": "693bc46d169f5af9c992095736e82c3488bf7dbb", + "rev": "0e82ab234249d8eee3e8c91437802b32c74bb3fd", "type": "github" }, "original": { "owner": "nixos", - "ref": "nixos-unstable", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, "process-compose-flake": { "locked": { - "lastModified": 1718031437, - "narHash": "sha256-+RrlkAVZx0QhyeHAGFJnjST+/7Dc3zsDU3zAKXoDXaI=", + "lastModified": 1740324671, + "narHash": "sha256-djc+wRG9L70jlW95Ck4GKr7nTPp1drfsXshJkYZAd9s=", "owner": "Platonic-Systems", "repo": "process-compose-flake", - "rev": "9344fac44edced4c686721686a6ad904d067c546", + "rev": "2a17e49b8a5d32278ed77e4a881f992472be18a1", "type": "github" }, "original": { @@ -509,11 +495,11 @@ "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1722534706, - "narHash": "sha256-9iGOtUWy7yVjQ2fncExoQUrbF0cOKFqWYb8KRF9BSTU=", + "lastModified": 1741351018, + "narHash": "sha256-qvAEg/CtB88q8ArleCpc72Tp93FLy6oHsSVv8UoEAGI=", "owner": "use-the-fork", "repo": "snow-blower", - "rev": "e4c83258538c81b3d51c33b74b60a37ed594d1fd", + "rev": "83924471128e839fc08cebdac5ce2ea50606c92e", "type": "github" }, "original": { @@ -557,11 +543,11 @@ "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1721769617, - "narHash": "sha256-6Pqa0bi5nV74IZcENKYRToRNM5obo1EQ+3ihtunJ014=", + "lastModified": 1739829690, + "narHash": "sha256-mL1szCeIsjh6Khn3nH2cYtwO5YXG6gBiTw1A30iGeDU=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "8db8970be1fb8be9c845af7ebec53b699fe7e009", + "rev": "3d0579f5cc93436052d94b73925b48973a104204", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 7b69d76..96f0721 100644 --- a/flake.nix +++ b/flake.nix @@ -93,6 +93,7 @@ }; services = { + aider.enable = true; }; integrations = { diff --git a/src/Memory/DatabaseMemory.php b/src/Memory/DatabaseMemory.php index 50b3c17..6cafc51 100644 --- a/src/Memory/DatabaseMemory.php +++ b/src/Memory/DatabaseMemory.php @@ -61,7 +61,7 @@ public function asInputs(): array public function boot(?PendingAgentTask $pendingAgentTask = null): void { if(!empty($this->memoryId)){ - $this->agentMemory = AgentMemory::firstOrNew($this->memoryId); + $this->agentMemory = AgentMemory::firstOrNew(['id' => $this->memoryId]); } else { $this->agentMemory = new AgentMemory; $this->agentMemory->save(); diff --git a/src/Models/AgentMemory.php b/src/Models/AgentMemory.php index 9ec454c..d5edad8 100644 --- a/src/Models/AgentMemory.php +++ b/src/Models/AgentMemory.php @@ -16,6 +16,7 @@ class AgentMemory extends Model protected $fillable = [ 'type', ]; + protected $table = 'synapse_agent_memories'; public function messages(): HasMany { diff --git a/src/Models/Message.php b/src/Models/Message.php index df83c62..dd5a457 100644 --- a/src/Models/Message.php +++ b/src/Models/Message.php @@ -9,6 +9,10 @@ class Message extends Model { + + protected $casts = [ + 'image' => 'array', + ]; protected $fillable = [ 'assistant_id', 'role', @@ -19,10 +23,7 @@ class Message extends Model 'tool_content', 'image', ]; - - protected $attributes = [ - 'image' => 'array', - ]; + protected $table = 'synapse_messages'; public function assistant() { diff --git a/src/Traits/Agent/LogsAgentActivity.php b/src/Traits/Agent/LogsAgentActivity.php index 6007e56..b99aa0c 100644 --- a/src/Traits/Agent/LogsAgentActivity.php +++ b/src/Traits/Agent/LogsAgentActivity.php @@ -45,8 +45,7 @@ protected function logStartThread(PendingAgentTask $pendingAgentTask): void protected function logStartIteration(PendingAgentTask $pendingAgentTask): void { $inputs = $pendingAgentTask->inputs(); - $iterationCount = $pendingAgentTask->currentIteration()->getIterationCount(); - Log::debug("Start Iteration {$iterationCount}", $inputs); + Log::debug("Start Iteration", $inputs); } /** @@ -56,35 +55,34 @@ protected function logStartIteration(PendingAgentTask $pendingAgentTask): void */ protected function logIntegrationResponse(PendingAgentTask $pendingAgentTask): void { - Log::debug("Finished Integration with {$pendingAgentTask->currentIteration()->finishReason()->value}"); + Log::debug("Finished Integration with {$pendingAgentTask->getResponse()->finishReason()}"); } protected function logStartToolCall(PendingAgentTask $pendingAgentTask): void { - $currentMessage = $pendingAgentTask->currentIteration()->getResponse()->toArray(); + $currentMessage = $pendingAgentTask->getResponse()->toArray(); Log::debug("Entering Tool Call: {$currentMessage['tool_name']}", $currentMessage); } protected function logAgentFinish(PendingAgentTask $pendingAgentTask): void { - $currentMessage = $pendingAgentTask->currentIteration()->getResponse()->toArray(); + $currentMessage = $pendingAgentTask->getResponse()->toArray(); Log::debug('Agent Finished', $currentMessage); } protected function logEndIteration(PendingAgentTask $pendingAgentTask): void { - $currentMessage = $pendingAgentTask->currentIteration()->getResponse(); - if ($currentMessage) { - $iterationCount = $pendingAgentTask->currentIteration()->getIterationCount(); - Log::debug("End Iteration {$iterationCount}", $currentMessage->toArray()); + $currentMessage = $pendingAgentTask->getResponse(); + if ($currentMessage->finishReason() == 'tool_calls') { + Log::debug("End Iteration", $currentMessage->toArray()); } } protected function logEndThread(PendingAgentTask $pendingAgentTask): void { $inputs = $pendingAgentTask->inputs(); - $currentMessage = $pendingAgentTask->currentIteration()->getResponse()->toArray(); + $currentMessage = $pendingAgentTask->getResponse()->toArray(); Log::debug('End Thread', [ 'inputs' => $inputs, @@ -94,7 +92,7 @@ protected function logEndThread(PendingAgentTask $pendingAgentTask): void protected function logEndToolCall(PendingAgentTask $pendingAgentTask): void { - $currentMessage = $pendingAgentTask->currentIteration()->getResponse()->toArray(); + $currentMessage = $pendingAgentTask->getResponse()->toArray(); Log::debug("Finished Tool Call: {$currentMessage['tool_name']}", $currentMessage); } } diff --git a/src/Traits/Agent/ManagesMemory.php b/src/Traits/Agent/ManagesMemory.php index 92f7fbd..b778ba5 100644 --- a/src/Traits/Agent/ManagesMemory.php +++ b/src/Traits/Agent/ManagesMemory.php @@ -32,9 +32,7 @@ public function addMessageToMemory(Message $message): void public function bootManagesMemory(PendingAgentTask $pendingAgentTask): void { $this->middleware()->onBootAgent(fn () => $this->initializeMemory($pendingAgentTask), 'initializeMemory'); - $this->middleware()->onStartThread(fn () => $this->addUserInputToMemoryPipeline($pendingAgentTask), 'memoryStartThread'); $this->middleware()->onStartIteration(fn () => $this->loadMemory($pendingAgentTask), 'loadMemory'); - $this->middleware()->onEndIteration(fn () => $this->addMessageToMemoryPipeline($pendingAgentTask), 'memoryEndIteration'); $this->middleware()->onAgentFinish(fn () => $this->addMessageToMemoryPipeline($pendingAgentTask), 'memoryAgentFinish'); } @@ -54,22 +52,6 @@ public function resolveMemory(): Memory throw new MissingResolverException('ManagesMemory', 'resolveMemory'); } - /** - * Adds a user message to the current memory - * - * @param PendingAgentTask $pendingAgentTask The message to add to the memory. - */ - protected function addUserInputToMemoryPipeline(PendingAgentTask $pendingAgentTask): PendingAgentTask - { - $input = $pendingAgentTask->getInput('input'); - $this->memory->create(Message::make([ - 'role' => 'user', - 'content' => $input, - ])); - - return $pendingAgentTask; - } - public function loadMemory(PendingAgentTask $pendingAgentTask): PendingAgentTask { $payload = $this->memory->asInputs(); @@ -87,7 +69,7 @@ public function loadMemory(PendingAgentTask $pendingAgentTask): PendingAgentTask */ protected function addMessageToMemoryPipeline(PendingAgentTask $pendingAgentTask): PendingAgentTask { - $message = $pendingAgentTask->currentIteration()->getResponse(); + $message = $pendingAgentTask->getResponse(); $this->memory->create($message); return $pendingAgentTask; diff --git a/tests/AgentChains/RatAgentChainTest.php b/tests/AgentChains/RatAgentChainTest.php index 191c149..4538d12 100644 --- a/tests/AgentChains/RatAgentChainTest.php +++ b/tests/AgentChains/RatAgentChainTest.php @@ -2,18 +2,18 @@ declare(strict_types=1); -use Saloon\Http\Faking\Fixture; -use Saloon\Http\Faking\MockClient; -use Saloon\Http\Faking\MockResponse; -use Saloon\Http\PendingRequest; -use UseTheFork\Synapse\AgentChains\RatAgentChain; -use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; -use UseTheFork\Synapse\Services\Firecrawl\Requests\FirecrawlRequest; -use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; -use UseTheFork\Synapse\Tools\Scrape\FirecrawlTool; -use UseTheFork\Synapse\Tools\Search\SerperTool; - -it('executes a RAT chain', function (): void { + use Saloon\Http\Faking\Fixture; + use Saloon\Http\Faking\MockClient; + use Saloon\Http\Faking\MockResponse; + use Saloon\Http\PendingRequest; + use UseTheFork\Synapse\AgentChains\RatAgentChain; + use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; + use UseTheFork\Synapse\Services\Firecrawl\Requests\FirecrawlRequest; + use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; + use UseTheFork\Synapse\Tools\Scrape\FirecrawlTool; + use UseTheFork\Synapse\Tools\Search\SerperTool; + + it('executes a RAT chain', function (): void { MockClient::global([ ChatRequest::class => function (PendingRequest $pendingRequest): Fixture { @@ -42,4 +42,4 @@ ->and($agentResponseArray['content'])->toHaveKey('answer') ->and($agentResponseArray['content']['answer'])->toContain('The American Civil War, which spanned from 1861 to 1865, '); -}); +})->skip('This test is only for local testing'); diff --git a/tests/Agents/ChatRephraseAgentTest.php b/tests/Agents/ChatRephraseAgentTest.php index 3d47e8a..beb865a 100644 --- a/tests/Agents/ChatRephraseAgentTest.php +++ b/tests/Agents/ChatRephraseAgentTest.php @@ -2,16 +2,16 @@ declare(strict_types=1); -use Saloon\Http\Faking\MockClient; -use Saloon\Http\Faking\MockResponse; -use Saloon\Http\PendingRequest; -use UseTheFork\Synapse\Agents\ChatRephraseAgent; -use UseTheFork\Synapse\Constants\Role; -use UseTheFork\Synapse\Enums\FinishReason; -use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; -use UseTheFork\Synapse\ValueObject\Message; + use Saloon\Http\Faking\MockClient; + use Saloon\Http\Faking\MockResponse; + use Saloon\Http\PendingRequest; + use UseTheFork\Synapse\Agents\ChatRephraseAgent; + use UseTheFork\Synapse\Constants\Role; + use UseTheFork\Synapse\Enums\FinishReason; + use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; + use UseTheFork\Synapse\ValueObject\Message; -it('can run the Chat Rephrase Agent.', function (): void { + it('can run the Chat Rephrase Agent.', function (): void { MockClient::global([ ChatRequest::class => function (PendingRequest $pendingRequest): \Saloon\Http\Faking\Fixture { @@ -39,4 +39,4 @@ expect($agentResponseArray['content'])->toBeArray() ->and($agentResponseArray['content'])->toHaveKey('standalone_question') ->and($agentResponseArray['content']['standalone_question'])->toBe('How can one improve heart health through gym activities?'); -}); +})->skip('This test is only for local testing'); diff --git a/tests/Agents/ContextualRetrievalPreprocessingAgentTest.php b/tests/Agents/ContextualRetrievalPreprocessingAgentTest.php index 6658fd2..256f911 100644 --- a/tests/Agents/ContextualRetrievalPreprocessingAgentTest.php +++ b/tests/Agents/ContextualRetrievalPreprocessingAgentTest.php @@ -25,4 +25,4 @@ expect($agentResponseArray['content'])->toBeArray() ->and($agentResponseArray['content'])->toHaveKey('succinct_context') ->and($agentResponseArray['content']['succinct_context'] == 'This chunk introduces the DiffExecutor struct which plays a central role in the differential fuzzing system by wrapping two executors. The primary and secondary executors are designed to run sequentially with the same input to differentiate their behavior.')->toBeTrue(); -}); +})->skip('This test is only for local testing'); diff --git a/tests/Agents/ImageAgentTest.php b/tests/Agents/ImageAgentTest.php index 9d4de44..83b93ba 100644 --- a/tests/Agents/ImageAgentTest.php +++ b/tests/Agents/ImageAgentTest.php @@ -2,17 +2,17 @@ declare(strict_types=1); -use Saloon\Http\Faking\MockClient; -use Saloon\Http\Faking\MockResponse; -use UseTheFork\Synapse\Agent; -use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; -use UseTheFork\Synapse\Contracts\Integration; -use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; -use UseTheFork\Synapse\Integrations\OpenAIIntegration; -use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; -use UseTheFork\Synapse\ValueObject\SchemaRule; - -test('can handle image input', function (): void { + use Saloon\Http\Faking\MockClient; + use Saloon\Http\Faking\MockResponse; + use UseTheFork\Synapse\Agent; + use UseTheFork\Synapse\Contracts\Agent\HasOutputSchema; + use UseTheFork\Synapse\Contracts\Integration; + use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; + use UseTheFork\Synapse\Integrations\OpenAIIntegration; + use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; + use UseTheFork\Synapse\ValueObject\SchemaRule; + + test('can handle image input', function (): void { MockClient::global([ ChatRequest::class => MockResponse::fixture('Agents/ImageAgentTestAgent'), @@ -50,4 +50,4 @@ public function resolveOutputSchema(): array expect($agentResponseArray)->toBeArray() ->and($agentResponseArray['content'])->toHaveKey('answer') ->and($agentResponseArray['content']['answer'])->toContain('You can also pass params to the loader.'); -}); +})->skip('This test is only for local testing'); diff --git a/tests/Agents/KnowledgeGraphExtractionAgentTest.php b/tests/Agents/KnowledgeGraphExtractionAgentTest.php deleted file mode 100644 index 1f58464..0000000 --- a/tests/Agents/KnowledgeGraphExtractionAgentTest.php +++ /dev/null @@ -1,26 +0,0 @@ - function (PendingRequest $pendingRequest) { - // $count = count($pendingRequest->body()->get('messages')); - // - // return MockResponse::fixture("agents/chat-rephrase-agent/message-{$count}"); - // }, - // ]); - - $agent = new KnowledgeGraphExtractionAgent; - - $agentResponse = $agent->handle(['input' => 'The ML2000 Series is an ANSI/BHMA Grade 1 mortise lock designed to meet the rigors of high-traffic, abusive environments. Constructed of heavy-gauge steel with unique, patented features and a full range of trim and functions including status indicators and Motorized Electric Latch Retraction (MELR), the versatility and reliability of this lock complement any application.']); - -// dd($agentResponse); - - expect($agentResponse)->toBeArray() - ->and($agentResponse)->toHaveKey('standalone_question') - ->and($agentResponse['standalone_question'] == 'What are some methods to improve heart health?')->toBeTrue(); -})->todo(); diff --git a/tests/Agents/MultiQueryRetrieverAgentTest.php b/tests/Agents/MultiQueryRetrieverAgentTest.php index b43dc3d..b538ca6 100644 --- a/tests/Agents/MultiQueryRetrieverAgentTest.php +++ b/tests/Agents/MultiQueryRetrieverAgentTest.php @@ -2,13 +2,13 @@ declare(strict_types=1); -use Saloon\Http\Faking\MockClient; -use Saloon\Http\Faking\MockResponse; -use Saloon\Http\PendingRequest; -use UseTheFork\Synapse\Agents\MultiQueryRetrieverAgent; -use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; + use Saloon\Http\Faking\MockClient; + use Saloon\Http\Faking\MockResponse; + use Saloon\Http\PendingRequest; + use UseTheFork\Synapse\Agents\MultiQueryRetrieverAgent; + use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; -it('can run the Multi Query Retriever Agent.', function (): void { + it('can run the Multi Query Retriever Agent.', function (): void { MockClient::global([ ChatRequest::class => function (PendingRequest $pendingRequest): \Saloon\Http\Faking\Fixture { @@ -28,4 +28,4 @@ ->and($agentResponseArray['content']['answer'])->toBeArray() ->and($agentResponseArray['content']['answer'])->toHaveCount(5); -}); +})->skip('This test is only for local testing'); diff --git a/tests/Agents/SQLToolAgentTest.php b/tests/Agents/SQLToolAgentTest.php index ed8f0ed..862d8db 100644 --- a/tests/Agents/SQLToolAgentTest.php +++ b/tests/Agents/SQLToolAgentTest.php @@ -2,14 +2,14 @@ declare(strict_types=1); -use Saloon\Http\Faking\MockClient; -use Saloon\Http\Faking\MockResponse; -use Saloon\Http\PendingRequest; -use UseTheFork\Synapse\Agents\SQLToolAgent; -use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; -use Workbench\App\Models\Organization; + use Saloon\Http\Faking\MockClient; + use Saloon\Http\Faking\MockResponse; + use Saloon\Http\PendingRequest; + use UseTheFork\Synapse\Agents\SQLToolAgent; + use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; + use Workbench\App\Models\Organization; -it('can run the SQL Tool Agent.', function (): void { + it('can run the SQL Tool Agent.', function (): void { for ($i = 0; $i < 100; $i++) { $org = new Organization; @@ -60,4 +60,4 @@ expect($agentResponseArray['content'])->toBeArray() ->and($agentResponseArray['content'])->toHaveKey('answer') ->and($agentResponseArray['content']['answer'])->toContain('100', '5'); -}); +})->skip('This test is only for local testing'); diff --git a/tests/Fixtures/Saloon/Console/SynapseArtisan-45fd717294d9994835af091e62465560.json b/tests/Fixtures/Saloon/Console/SynapseArtisan-45fd717294d9994835af091e62465560.json new file mode 100644 index 0000000..d37cc5d --- /dev/null +++ b/tests/Fixtures/Saloon/Console/SynapseArtisan-45fd717294d9994835af091e62465560.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 11 Mar 2025 22:45:34 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-BA2doAIZsW4qZcbKa2CwMrkau5guX\",\n \"object\": \"chat.completion\",\n \"created\": 1741733132,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"command\\\": \\\"make:model Flight -m\\\"\\n}\\n```\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 482,\n \"completion_tokens\": 18,\n \"total_tokens\": 500,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": \"default\",\n \"system_fingerprint\": \"fp_7c63087da1\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Console/SynapseArtisan-9de9d17283d00e1b029790c472e08b72.json b/tests/Fixtures/Saloon/Console/SynapseArtisan-9de9d17283d00e1b029790c472e08b72.json new file mode 100644 index 0000000..65eea70 --- /dev/null +++ b/tests/Fixtures/Saloon/Console/SynapseArtisan-9de9d17283d00e1b029790c472e08b72.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 11 Mar 2025 22:45:35 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-BA2dq8fsMiU95gs9Bt5ELmeRicwO2\",\n \"object\": \"chat.completion\",\n \"created\": 1741733134,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"command\\\": \\\"make:model Plane -m -c\\\"\\n}\\n```\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 514,\n \"completion_tokens\": 20,\n \"total_tokens\": 534,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": \"default\",\n \"system_fingerprint\": \"fp_7c63087da1\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Memory/CollectionMemory-2b5f90ae806afa53a979306da93d9e84.json b/tests/Fixtures/Saloon/Memory/CollectionMemory-2b5f90ae806afa53a979306da93d9e84.json new file mode 100644 index 0000000..941fe6b --- /dev/null +++ b/tests/Fixtures/Saloon/Memory/CollectionMemory-2b5f90ae806afa53a979306da93d9e84.json @@ -0,0 +1,31 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 11 Mar 2025 22:45:38 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive", + "access-control-expose-headers": "X-Request-ID", + "openai-organization": "REDACTED", + "openai-processing-ms": "1366", + "openai-version": "2020-10-01", + "x-ratelimit-limit-requests": "10000", + "x-ratelimit-limit-tokens": "2000000", + "x-ratelimit-remaining-requests": "9999", + "x-ratelimit-remaining-tokens": "1999877", + "x-ratelimit-reset-requests": "6ms", + "x-ratelimit-reset-tokens": "3ms", + "x-request-id": "REDACTED", + "strict-transport-security": "max-age=31536000; includeSubDomains; preload", + "cf-cache-status": "DYNAMIC", + "Set-Cookie": [ + "__cf_bm=wWNfZoxQMmS6dKim6QcCoAL40L2W5cXKOLhC8CpZyxI-1741733138-1.0.1.1-Cc3oHpGWSMy0DgU4qKLKrtoad9DaxhDAImO3iV57tSsoMPOTGTBaxgthdKmCUt9xK7fGhuTBPjm2bhu48hbPbq1_RY8HdT5nHlsch_Tj7Eo; path=\/; expires=Tue, 11-Mar-25 23:15:38 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", + "_cfuvid=H8U2WRFV6qQm.Za5vBTkYRoS7KEciwnKhbPf5TWMago-1741733138148-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" + ], + "X-Content-Type-Options": "nosniff", + "Server": "cloudflare", + "CF-RAY": "REDACTED", + "alt-svc": "h3=\":443\"; ma=86400" + }, + "data": "{\n \"id\": \"chatcmpl-BA2dsubK1Z9Akze1pzcIAN8KgSCtZ\",\n \"object\": \"chat.completion\",\n \"created\": 1741733136,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Hello! How can I assist you today?\\\"\\n}\\n```\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 99,\n \"completion_tokens\": 21,\n \"total_tokens\": 120,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": \"default\",\n \"system_fingerprint\": \"fp_7c63087da1\"\n}\n" +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Memory/CollectionMemory-dfff118fdeea050656d98836a66f4f01.json b/tests/Fixtures/Saloon/Memory/CollectionMemory-dfff118fdeea050656d98836a66f4f01.json new file mode 100644 index 0000000..cc05622 --- /dev/null +++ b/tests/Fixtures/Saloon/Memory/CollectionMemory-dfff118fdeea050656d98836a66f4f01.json @@ -0,0 +1,31 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 11 Mar 2025 22:45:41 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive", + "access-control-expose-headers": "X-Request-ID", + "openai-organization": "REDACTED", + "openai-processing-ms": "3097", + "openai-version": "2020-10-01", + "x-ratelimit-limit-requests": "10000", + "x-ratelimit-limit-tokens": "2000000", + "x-ratelimit-remaining-requests": "9999", + "x-ratelimit-remaining-tokens": "1999854", + "x-ratelimit-reset-requests": "6ms", + "x-ratelimit-reset-tokens": "4ms", + "x-request-id": "REDACTED", + "strict-transport-security": "max-age=31536000; includeSubDomains; preload", + "cf-cache-status": "DYNAMIC", + "Set-Cookie": [ + "__cf_bm=hEoe0baAvLIBOlZ33YXZLjprmy3gz8Cm9gj9cpvi9qE-1741733141-1.0.1.1-wpMa0aKelK2.LEj6bZz1XW_2KTbwypOMt_X_RBCcq17LqFrs2d01xDovUkyWN38Nh8aDv8H92hWuADagKjhTyZssA96wPFALty632QiTGNg; path=\/; expires=Tue, 11-Mar-25 23:15:41 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", + "_cfuvid=sJ2OgXay21v_fLK50anb72ebC0jJNd7KIHi5lVonjAs-1741733141504-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" + ], + "X-Content-Type-Options": "nosniff", + "Server": "cloudflare", + "CF-RAY": "REDACTED", + "alt-svc": "h3=\":443\"; ma=86400" + }, + "data": "{\n \"id\": \"chatcmpl-BA2dugae1Y6j19SmPYBZXpAu52hb4\",\n \"object\": \"chat.completion\",\n \"created\": 1741733138,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"?yadot uoy tsi**a**ss I nac woH !olleH\\\"\\n}\\n```\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 128,\n \"completion_tokens\": 32,\n \"total_tokens\": 160,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": \"default\",\n \"system_fingerprint\": \"fp_bf9cb2c77f\"\n}\n" +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-4d99e66b29cfdc8b1693e0ccf1306612.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-4d99e66b29cfdc8b1693e0ccf1306612.json new file mode 100644 index 0000000..f3715d3 --- /dev/null +++ b/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-4d99e66b29cfdc8b1693e0ccf1306612.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 11 Mar 2025 23:00:41 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-BA2sRBVIBbG4mJa6CxDU9reaNTB1k\",\n \"object\": \"chat.completion\",\n \"created\": 1741734039,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"The conversation continues to focus solely on a test. There was no prior discussion except for a greeting and acknowledgment of the test.\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 153,\n \"completion_tokens\": 26,\n \"total_tokens\": 179,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": \"default\",\n \"system_fingerprint\": \"fp_7c63087da1\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-4de6d484520d502d2ee2f7cfc8d03616.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-4de6d484520d502d2ee2f7cfc8d03616.json new file mode 100644 index 0000000..9f90084 --- /dev/null +++ b/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-4de6d484520d502d2ee2f7cfc8d03616.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 11 Mar 2025 22:56:32 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-BA2oQbhZjIPTRSzlBW0EuboY39blj\",\n \"object\": \"chat.completion\",\n \"created\": 1741733790,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"There was no prior conversation to summarize, beyond your greeting and mentioning that this is a test.\\\"\\n}\\n```\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 108,\n \"completion_tokens\": 31,\n \"total_tokens\": 139,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": \"default\",\n \"system_fingerprint\": \"fp_7c63087da1\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-5bb9375587f60ab90598e4e35ef208bb.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-5bb9375587f60ab90598e4e35ef208bb.json new file mode 100644 index 0000000..03c4b70 --- /dev/null +++ b/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-5bb9375587f60ab90598e4e35ef208bb.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 11 Mar 2025 23:00:39 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-BA2sPVx3GjzyfEMqR1KdXe1ZQIslg\",\n \"object\": \"chat.completion\",\n \"created\": 1741734037,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\".tset eht fo tnemelckwoda dna gniteerg a sedisdeb noissucsid roirp on saw ereht dna ,tset a evlovni snoitavresnoc eht svolni noitasrevnoC ##\\\"\\n}\\n```\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 136,\n \"completion_tokens\": 67,\n \"total_tokens\": 203,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": \"default\",\n \"system_fingerprint\": \"fp_7c63087da1\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-bf2f932a9607c7432e73ab858d97f0a4.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-bf2f932a9607c7432e73ab858d97f0a4.json new file mode 100644 index 0000000..e9a9eca --- /dev/null +++ b/tests/Fixtures/Saloon/Memory/ConversationSummaryAgent-bf2f932a9607c7432e73ab858d97f0a4.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 11 Mar 2025 22:56:33 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-BA2oS61BPczvfFOmnEBgycQPHSltC\",\n \"object\": \"chat.completion\",\n \"created\": 1741733792,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"The conversation involves a test, and there was no prior discussion besides a greeting and acknowledgment of the test.\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 78,\n \"completion_tokens\": 22,\n \"total_tokens\": 100,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": \"default\",\n \"system_fingerprint\": \"fp_7c63087da1\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-32ae472286b057df708d31ea881cb283.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-32ae472286b057df708d31ea881cb283.json new file mode 100644 index 0000000..463c770 --- /dev/null +++ b/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-32ae472286b057df708d31ea881cb283.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 11 Mar 2025 22:31:02 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-BA2PlapK5HkdsqCsEqtzVyQN9vAID\",\n \"object\": \"chat.completion\",\n \"created\": 1741732261,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Donald J. Trump is the current president of the United States.\\\"\\n}\\n```\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1579,\n \"completion_tokens\": 26,\n \"total_tokens\": 1605,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": \"default\",\n \"system_fingerprint\": \"fp_7c63087da1\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-560e8c18c3ee1995f229f46dd73dcc33.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-560e8c18c3ee1995f229f46dd73dcc33.json new file mode 100644 index 0000000..e32a0bd --- /dev/null +++ b/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-560e8c18c3ee1995f229f46dd73dcc33.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 11 Mar 2025 22:55:19 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-BA2nGTcjCjZ6Zg7rJQTwH13zUDuqj\",\n \"object\": \"chat.completion\",\n \"created\": 1741733718,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"The summary of the conversation is that Donald J. Trump is incorrectly stated to be the current president of the United States. Vice President Kamala Harris is serving under President Joe Biden.\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 123,\n \"completion_tokens\": 37,\n \"total_tokens\": 160,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": \"default\",\n \"system_fingerprint\": \"fp_7c63087da1\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-7ad11bd7dd13649bbf0c0ee2f8935881.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-7ad11bd7dd13649bbf0c0ee2f8935881.json new file mode 100644 index 0000000..e3299f7 --- /dev/null +++ b/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-7ad11bd7dd13649bbf0c0ee2f8935881.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 11 Mar 2025 22:31:00 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-BA2Pj2XqTUhjHmmB7Z1S8Apx9foPq\",\n \"object\": \"chat.completion\",\n \"created\": 1741732259,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_gOfBjqem8wzVXhTg6FLGIDEX\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"serper_tool\",\n \"arguments\": \"{\\\"query\\\":\\\"current president of the United States\\\",\\\"searchType\\\":\\\"search\\\",\\\"numberOfResults\\\":10}\"\n }\n }\n ],\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 223,\n \"completion_tokens\": 31,\n \"total_tokens\": 254,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": \"default\",\n \"system_fingerprint\": \"fp_7c63087da1\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-8afadb44cc44e4a50f20f3cbfa927732.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-8afadb44cc44e4a50f20f3cbfa927732.json new file mode 100644 index 0000000..1ffd31c --- /dev/null +++ b/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-8afadb44cc44e4a50f20f3cbfa927732.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 11 Mar 2025 22:31:04 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-BA2PnvictkuFLYzeipgSyTrDCoCtf\",\n \"object\": \"chat.completion\",\n \"created\": 1741732263,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"The summary of the conversation is that Donald J. Trump is stated to be the current president of the United States.\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 72,\n \"completion_tokens\": 24,\n \"total_tokens\": 96,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": \"default\",\n \"system_fingerprint\": \"fp_7c63087da1\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-Tool-37a6259cc0c1dae299a7866489dff0bd.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-Tool-37a6259cc0c1dae299a7866489dff0bd.json new file mode 100644 index 0000000..4f08f8a --- /dev/null +++ b/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-Tool-37a6259cc0c1dae299a7866489dff0bd.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "access-control-allow-origin": "*", + "x-ratelimit-limit": "500", + "x-ratelimit-remaining": "499", + "x-ratelimit-reset": "1741732265" + }, + "data": "{\"searchParameters\":{\"q\":\"current president of the United States\",\"type\":\"search\",\"num\":10,\"engine\":\"google\"},\"answerBox\":{\"title\":\"United States \/ President\",\"answer\":\"Donald Trump\"},\"knowledgeGraph\":{\"title\":\"Donald Trump\",\"type\":\"45th and 47th U.S. President\",\"imageUrl\":\"https:\/\/encrypted-tbn0.gstatic.com\/images?q=tbn:ANd9GcSOpSNNTTnQQt9_M1jlNzxfjl66Y0WTu7qfQ8sPi5VCsvtohzYQWdiT7g&s=0\",\"description\":\"Donald John Trump is an American politician, media personality, and businessman who is the 47th president of the United States. A member of the Republican Party, he served as the 45th president from 2017 to 2021.\",\"descriptionSource\":\"Wikipedia\",\"descriptionLink\":\"https:\/\/en.wikipedia.org\/wiki\/Donald_Trump\",\"attributes\":{\"Born\":\"June 14, 1946 (age 78\u00a0years), Jamaica Hospital Medical Center, New York, NY\",\"Organizations founded\":\"Department of Government Efficiency, Trump Winery, Trump Media & Technology Group, and more\",\"Aunts\":\"Elizabeth Trump Walters and Christina Matheson\",\"Cousins\":\"John Gordon Trump, Karen Ingraham, and Christine Philp\",\"Grandchildren\":\"Kai Madison Trump and Donald Trump III\",\"Grandparents\":\"Malcolm MacLeod, Frederick Trump, Elizabeth Christ Trump, and more\",\"Great-grandparents\":\"Christian Johannes Trump, Katharina Trump, Ann MacLeod, and more\"}},\"organic\":[{\"title\":\"The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/\",\"snippet\":\"Donald J. Trump. President of the United States \u00b7 JD Vance. VICE PRESIDENT OF THE UNITED STATES \u00b7 Melania Trump. First Lady OF THE UNITED STATES \u00b7 The Cabinet. Of ...\",\"position\":1},{\"title\":\"President of the United States\",\"link\":\"https:\/\/usun.usmission.gov\/our-leaders\/the-president-of-the-united-states\/\",\"snippet\":\"Donald J. Trump serves as the 47th President of the United States. He also served as the 45th. Read the President's full biography.\",\"position\":2},{\"title\":\"President of the United States - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/President_of_the_United_States\",\"snippet\":\"Donald Trump is the 47th and current president since January 20, 2025. Contents. 1 History and development. 1.1 Origins; 1.2 1789\u20131933; 1.3 Imperial ...\",\"sitelinks\":[{\"title\":\"List\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/List_of_presidents_of_the_United_States\"},{\"title\":\"Powers\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Powers_of_the_president_of_the_United_States\"},{\"title\":\"Executive Office\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Executive_Office_of_the_President_of_the_United_States\"},{\"title\":\"Vice President\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/Vice_President_of_the_United_States\"}],\"position\":3},{\"title\":\"The Trump Administration - The White House\",\"link\":\"https:\/\/www.whitehouse.gov\/administration\/\",\"snippet\":\"Donald J. Trump. 45th & 47th President of the United States. After a landslide election victory in 2024, President Donald J. Trump is returning to the White ...\",\"position\":4},{\"title\":\"Presidents, vice presidents, and first ladies | USAGov\",\"link\":\"https:\/\/www.usa.gov\/presidents\",\"snippet\":\"The 47th and current president of the United States is Donald John Trump. He was sworn into office on January 20, 2025.\",\"position\":5},{\"title\":\"President Donald J. Trump (@potus) \u2022 Instagram photos and videos\",\"link\":\"https:\/\/www.instagram.com\/potus\/?hl=en\",\"snippet\":\"President Donald J. Trump 45th & 47th President of the United States. The Golden Age of America Begins Right Now.\",\"position\":6},{\"title\":\"List of presidents of the United States - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/List_of_presidents_of_the_United_States\",\"snippet\":\"The incumbent president is Donald Trump, who assumed office on January 20, 2025. Since the office was established in 1789, 45 men have served ...\",\"sitelinks\":[{\"title\":\"Presidents\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/List_of_presidents_of_the_United_States#Presidents\"},{\"title\":\"Notes\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/List_of_presidents_of_the_United_States#Notes\"},{\"title\":\"References\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/List_of_presidents_of_the_United_States#References\"}],\"position\":7},{\"title\":\"Donald J. Trump: America's new president\",\"link\":\"https:\/\/me.usembassy.gov\/donald-j-trump-americas-new-president\/\",\"snippet\":\"President Donald J. Trump is returning to the White House as the 47th president to build upon his previous successes, unleash the American economy.\",\"date\":\"Jan 23, 2025\",\"position\":8},{\"title\":\"Presidents of the United States of America - Ohio Secretary of State\",\"link\":\"https:\/\/www.ohiosos.gov\/elections\/election-results-and-data\/historical-election-comparisons\/presidents-of-the-united-states-of-america\/\",\"snippet\":\"Dwight D. Joseph R. Biden, Jr. (a) Authorities differ as to Jackson's birthplace and some believe his birthplace to be Union County, North Carolina.\",\"position\":9}],\"peopleAlsoAsk\":[{\"question\":\"Who is president right now?\",\"snippet\":\"Donald J. Trump serves as the 47th President of the United States.\",\"title\":\"President of the United States\",\"link\":\"https:\/\/usun.usmission.gov\/our-leaders\/the-president-of-the-united-states\/\"},{\"question\":\"Who is the new president in the United States?\",\"snippet\":\"President of the United States\\n\\nPresidential flag\\n\\nIncumbent Donald Trump since January 20, 2025\\n\\nExecutive branch of the U.S. government Executive Office of the President\\n\\nStyle\\nMr. President (informal) The Honorable (formal) His Excellency (diplomatic)\",\"title\":\"President of the United States - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/President_of_the_United_States\"},{\"question\":\"Are there 45 or 46 presidents?\",\"snippet\":\"Since the office was established in 1789, 45 men have served in 47 presidencies; the discrepancy arises from two individuals elected to non-consecutive terms: Grover Cleveland is counted as the 22nd and 24th president of the United States, while Donald Trump is counted as the 45th and 47th president.\",\"title\":\"List of presidents of the United States - Wikipedia\",\"link\":\"https:\/\/en.wikipedia.org\/wiki\/List_of_presidents_of_the_United_States\"},{\"question\":\"Who was the 48th president?\",\"snippet\":\"Presidents of the United States of America\\nPresident\/ Term\\n\\n36\\n44, (b)45\\nLyndon Baines Johnson\\n37\\n46,47\\nRichard M. Nixon\\n38\\n47 (b)\\nGerald R. Ford\\n39\\n48\\nJimmy Carter\",\"title\":\"Presidents of the United States of America - Ohio Secretary of State\",\"link\":\"https:\/\/www.ohiosos.gov\/elections\/election-results-and-data\/historical-election-comparisons\/presidents-of-the-united-states-of-america\/\"}],\"credits\":1}" +} diff --git a/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-fd244ad8f44fd521474d587db86ae4c7.json b/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-fd244ad8f44fd521474d587db86ae4c7.json new file mode 100644 index 0000000..b52b7c5 --- /dev/null +++ b/tests/Fixtures/Saloon/Memory/ConversationSummaryWithToolsAgent-fd244ad8f44fd521474d587db86ae4c7.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 11 Mar 2025 22:55:18 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-BA2nFmw0xbtGswzkzvTxCt0vYQ26l\",\n \"object\": \"chat.completion\",\n \"created\": 1741733717,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Vice President Kamala Harris is serving under President Joe Biden. Donald J. Trump is not the current president.\\\"\\n}\\n```\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 242,\n \"completion_tokens\": 36,\n \"total_tokens\": 278,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": \"default\",\n \"system_fingerprint\": \"fp_7c63087da1\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Memory/DatabaseMemory-472476cf0424ea3af72057915e207478.json b/tests/Fixtures/Saloon/Memory/DatabaseMemory-472476cf0424ea3af72057915e207478.json new file mode 100644 index 0000000..18d6ec0 --- /dev/null +++ b/tests/Fixtures/Saloon/Memory/DatabaseMemory-472476cf0424ea3af72057915e207478.json @@ -0,0 +1,31 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 11 Mar 2025 22:47:38 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive", + "access-control-expose-headers": "X-Request-ID", + "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", + "openai-processing-ms": "1236", + "openai-version": "2020-10-01", + "x-ratelimit-limit-requests": "10000", + "x-ratelimit-limit-tokens": "2000000", + "x-ratelimit-remaining-requests": "9999", + "x-ratelimit-remaining-tokens": "1999877", + "x-ratelimit-reset-requests": "6ms", + "x-ratelimit-reset-tokens": "3ms", + "x-request-id": "req_c3e7c4e20282d5e03bfe92a7803d3f14", + "strict-transport-security": "max-age=31536000; includeSubDomains; preload", + "CF-Cache-Status": "DYNAMIC", + "Set-Cookie": [ + "__cf_bm=i8XmZzY5PUFvBVWUq5eiU3BIQzXe8d7V5BbxH5JX.VA-1741733258-1.0.1.1-XM0.NktYe8xZ38S3d0XJaPkMj2P_vwjBoR3EZTMFrX_9Xwi6Wd4_yxffoyttCzgni3d9IdjcerxIUPCRbkhIv_nAfxG552jr_VSPKfE4xKQ; path=\/; expires=Tue, 11-Mar-25 23:17:38 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", + "_cfuvid=RmsQgvpflf3.oAK9MgV4Rky3mtZ4eww83no4QrhmKGo-1741733258377-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" + ], + "X-Content-Type-Options": "nosniff", + "Server": "cloudflare", + "CF-RAY": "91ee9837ed07306b-BOS", + "alt-svc": "h3=\":443\"; ma=86400" + }, + "data": "{\n \"id\": \"chatcmpl-BA2fpmkKc9ZJ6Zd8IyXkw0SApDQUr\",\n \"object\": \"chat.completion\",\n \"created\": 1741733257,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"Hello! How can I assist you today?\\\"\\n}\\n```\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 98,\n \"completion_tokens\": 21,\n \"total_tokens\": 119,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": \"default\",\n \"system_fingerprint\": \"fp_7c63087da1\"\n}\n" +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Memory/DatabaseMemory-d8ef1e6148a4a1a85e9d5d0f11254784.json b/tests/Fixtures/Saloon/Memory/DatabaseMemory-d8ef1e6148a4a1a85e9d5d0f11254784.json new file mode 100644 index 0000000..92ff41f --- /dev/null +++ b/tests/Fixtures/Saloon/Memory/DatabaseMemory-d8ef1e6148a4a1a85e9d5d0f11254784.json @@ -0,0 +1,31 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 11 Mar 2025 22:47:39 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive", + "access-control-expose-headers": "X-Request-ID", + "openai-organization": "user-5hvzt3x5aqwr0picqhxifwl8", + "openai-processing-ms": "939", + "openai-version": "2020-10-01", + "x-ratelimit-limit-requests": "10000", + "x-ratelimit-limit-tokens": "2000000", + "x-ratelimit-remaining-requests": "9999", + "x-ratelimit-remaining-tokens": "1999872", + "x-ratelimit-reset-requests": "6ms", + "x-ratelimit-reset-tokens": "3ms", + "x-request-id": "req_b1d384b49d1cbac23b9588b121b42ec5", + "strict-transport-security": "max-age=31536000; includeSubDomains; preload", + "cf-cache-status": "DYNAMIC", + "Set-Cookie": [ + "__cf_bm=y.UQUzztMx1LiLSkl8pJGFuAIMQ0XEo69Ry0qTbpndE-1741733259-1.0.1.1-ZJ5bYh0kAy6lF1ZtYp_m6cmHx0ENFjq94VTzOvyJeuTHk_3PtlK48xhSyvJi3H_NZIyrb.Y40hWZhPQMGnqgx183qG2bDAipI4hWm9pz6Lg; path=\/; expires=Tue, 11-Mar-25 23:17:39 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", + "_cfuvid=rmHtgFpf4SYDTmg219o49KXrXdhmHhj4YpgRL.yYdFg-1741733259639-0.0.1.1-604800000; path=\/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None" + ], + "X-Content-Type-Options": "nosniff", + "Server": "cloudflare", + "CF-RAY": "91ee9841feff4cf4-BOS", + "alt-svc": "h3=\":443\"; ma=86400" + }, + "data": "{\n \"id\": \"chatcmpl-BA2fqCAt4ZivFvQw1BcZJheXKvo7t\",\n \"object\": \"chat.completion\",\n \"created\": 1741733258,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"sdrawkcaB .yas tsuj I did tahw\\\"\\n}\\n```\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 104,\n \"completion_tokens\": 26,\n \"total_tokens\": 130,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": \"default\",\n \"system_fingerprint\": \"fp_7c63087da1\"\n}\n" +} \ No newline at end of file diff --git a/tests/Fixtures/Saloon/Tools/SQLTestAgent-32010a33b3c9a74d727fd084d741b723.json b/tests/Fixtures/Saloon/Tools/SQLTestAgent-32010a33b3c9a74d727fd084d741b723.json new file mode 100644 index 0000000..4386aac --- /dev/null +++ b/tests/Fixtures/Saloon/Tools/SQLTestAgent-32010a33b3c9a74d727fd084d741b723.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 11 Mar 2025 22:35:05 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-BA2Tg9OLCnafZfBrfPZPvwzYx1eii\",\n \"object\": \"chat.completion\",\n \"created\": 1741732504,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_vn9gNVjXQhe8mgPko9D5s4sA\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"query_s_q_l_data_base_tool\",\n \"arguments\": \"{\\\"query\\\":\\\"SELECT COUNT(*) AS organization_count, AVG(num_funding_rounds) AS average_funding_rounds FROM organizations WHERE status = 'operating'\\\"}\"\n }\n }\n ],\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1182,\n \"completion_tokens\": 48,\n \"total_tokens\": 1230,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": \"default\",\n \"system_fingerprint\": \"fp_7c63087da1\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Tools/SQLTestAgent-66d1e5c81c777310402eeedcac4d9854.json b/tests/Fixtures/Saloon/Tools/SQLTestAgent-66d1e5c81c777310402eeedcac4d9854.json new file mode 100644 index 0000000..d43f3c2 --- /dev/null +++ b/tests/Fixtures/Saloon/Tools/SQLTestAgent-66d1e5c81c777310402eeedcac4d9854.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 11 Mar 2025 22:35:02 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-BA2TWQ0fWQ14cPG8xAvRbVnEE2fMr\",\n \"object\": \"chat.completion\",\n \"created\": 1741732494,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_0yhH0Zokg7KeawPgHLsR5XFK\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"query_s_q_l_data_base_tool\",\n \"arguments\": \"{\\\"query\\\":\\\"SELECT COUNT(*) AS organization_count, AVG(funding_rounds) AS average_funding_rounds FROM organizations WHERE status = 'operating'\\\"}\"\n }\n }\n ],\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 349,\n \"completion_tokens\": 47,\n \"total_tokens\": 396,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": \"default\",\n \"system_fingerprint\": \"fp_7c63087da1\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Tools/SQLTestAgent-abf1d4c9a9f535c0fbcb9eff86e94f08.json b/tests/Fixtures/Saloon/Tools/SQLTestAgent-abf1d4c9a9f535c0fbcb9eff86e94f08.json new file mode 100644 index 0000000..323d1ff --- /dev/null +++ b/tests/Fixtures/Saloon/Tools/SQLTestAgent-abf1d4c9a9f535c0fbcb9eff86e94f08.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 11 Mar 2025 22:34:11 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-BA2SoKLA4Fk9GT1H380nK7p2sRkQo\",\n \"object\": \"chat.completion\",\n \"created\": 1741732450,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_8jaJA5AbElrJ7SKdxKJkMy65\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"list_s_q_l_database_tool\",\n \"arguments\": \"{}\"\n }\n }\n ],\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 284,\n \"completion_tokens\": 15,\n \"total_tokens\": 299,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": \"default\",\n \"system_fingerprint\": \"fp_7c63087da1\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Tools/SQLTestAgent-c3e01ea6bb2c55897054959716fc7d4b.json b/tests/Fixtures/Saloon/Tools/SQLTestAgent-c3e01ea6bb2c55897054959716fc7d4b.json new file mode 100644 index 0000000..6af27c7 --- /dev/null +++ b/tests/Fixtures/Saloon/Tools/SQLTestAgent-c3e01ea6bb2c55897054959716fc7d4b.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 11 Mar 2025 22:35:07 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-BA2TiLIXLUOzFXZ4nUDp8QzpR81z8\",\n \"object\": \"chat.completion\",\n \"created\": 1741732506,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"answer\\\": \\\"There are 100 organizations operating and the average number of funding rounds for them is 5.\\\"\\n}\\n```\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1257,\n \"completion_tokens\": 32,\n \"total_tokens\": 1289,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": \"default\",\n \"system_fingerprint\": \"fp_bf9cb2c77f\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Tools/SQLTestAgent-c739a365fead056b4056318d93427f1f.json b/tests/Fixtures/Saloon/Tools/SQLTestAgent-c739a365fead056b4056318d93427f1f.json new file mode 100644 index 0000000..323ee15 --- /dev/null +++ b/tests/Fixtures/Saloon/Tools/SQLTestAgent-c739a365fead056b4056318d93427f1f.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 11 Mar 2025 22:35:04 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-BA2TfKj2B2Z19l5WKdvUJ9KYbKAcS\",\n \"object\": \"chat.completion\",\n \"created\": 1741732503,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_hjalJcC4sp9LDGdg3ugzOX6W\",\n \"type\": \"function\",\n \"function\": {\n \"name\": \"info_s_q_l_database_tool\",\n \"arguments\": \"{\\\"tables\\\":\\\"organizations\\\"}\"\n }\n }\n ],\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"tool_calls\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 461,\n \"completion_tokens\": 19,\n \"total_tokens\": 480,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": \"default\",\n \"system_fingerprint\": \"fp_7c63087da1\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-39bc17d178807a04cb3b9318f2573b99.json b/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-39bc17d178807a04cb3b9318f2573b99.json new file mode 100644 index 0000000..ee17325 --- /dev/null +++ b/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-39bc17d178807a04cb3b9318f2573b99.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 11 Mar 2025 23:09:57 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-BA31AChDOL089R3qzaz5hvO9T2sB8\",\n \"object\": \"chat.completion\",\n \"created\": 1741734580,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"pdfs\\\": [\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/STCASSEMBLIESPIOSONICSERIES2018.pdf\\\",\\n \\\"title\\\": \\\"Acoustic Assemblies\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/PiocaneFEMAICC500residentialsaferooms.pdf\\\",\\n \\\"title\\\": \\\"Tornado Resistant Door For Residential Safe Rooms Complies With Icc 500\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/PiocaneFEMAICC500SHELTERSINGLEMOTIONLOCKS.pdf\\\",\\n \\\"title\\\": \\\"Tornado Resistant Door For Shelters With Single Motion Locks Complies With Icc 500\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/Piocane50StorefrontHVHZ11.pdf\\\",\\n \\\"title\\\": \\\"+\/- 50 Psf Hurricane Rated Storefront Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/PIOCANE50FG.pdf\\\",\\n \\\"title\\\": \\\"+\/-50 Psf Hurricane Rated Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/Piocane70HVHZ1.pdf\\\",\\n \\\"title\\\": \\\"+\/- 70 Psf Hurricane Rated Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/1-PIOCANE-50 FG.pdf\\\",\\n \\\"title\\\": \\\"+\/- 50 Psf Hurricane Rated Full Glass Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/SBR16.pdf\\\",\\n \\\"title\\\": \\\"Engineering Details For Blast Resistant Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/BR752DOORASSEMBLY.pdf\\\",\\n \\\"title\\\": \\\"Bullet Resistant Door Complies With Ul 752 Level 1 And Level3\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n }\\n ]\\n}\\n```\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1119,\n \"completion_tokens\": 610,\n \"total_tokens\": 1729,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": \"default\",\n \"system_fingerprint\": \"fp_bf9cb2c77f\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-46dc2f6885dcaf33d1f51f9d37f74b0e.json b/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-46dc2f6885dcaf33d1f51f9d37f74b0e.json new file mode 100644 index 0000000..5b0a692 --- /dev/null +++ b/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-46dc2f6885dcaf33d1f51f9d37f74b0e.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 11 Mar 2025 23:19:53 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-BA3AplxDCs3oK8EUQDc88wlVv94fY\",\n \"object\": \"chat.completion\",\n \"created\": 1741735179,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"```json\\n{\\n \\\"pdfs\\\": [\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/STCASSEMBLIESPIOSONICSERIES2018.pdf\\\",\\n \\\"title\\\": \\\"Acoustic Assemblies\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/PiocaneFEMAICC500residentialsaferooms.pdf\\\",\\n \\\"title\\\": \\\"Tornado Resistant Door For Residential Safe Rooms Complies With Icc 500\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/PiocaneFEMAICC500SHELTERSINGLEMOTIONLOCKS.pdf\\\",\\n \\\"title\\\": \\\"Tornado Resistant Door For Shelters With Single Motion Locks Complies With Icc 500\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/Piocane50StorefrontHVHZ11.pdf\\\",\\n \\\"title\\\": \\\"+\/- 50 Psf Hurricane Rated Storefront Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/PIOCANE50FG.pdf\\\",\\n \\\"title\\\": \\\"+\/-50 Psf Hurricane Rated Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/Piocane70HVHZ1.pdf\\\",\\n \\\"title\\\": \\\"+\/- 70 Psf Hurricane Rated Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/1-PIOCANE-50FG.pdf\\\",\\n \\\"title\\\": \\\"+\/- 50 Psf Hurricane Rated Full Glass Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/SBR16.pdf\\\",\\n \\\"title\\\": \\\"Engineering Details For Blast Resistant Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/BR752DOORASSEMBLY.pdf\\\",\\n \\\"title\\\": \\\"Bullet Resistant Door Complies With Ul 752 Level 1 And Level3\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n }\\n ]\\n}\\n```\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 3721,\n \"completion_tokens\": 613,\n \"total_tokens\": 4334,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": \"default\",\n \"system_fingerprint\": \"fp_7c63087da1\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-5f5602e2afd0c53f0a77b94e1ee969b7.json b/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-5f5602e2afd0c53f0a77b94e1ee969b7.json new file mode 100644 index 0000000..a587673 --- /dev/null +++ b/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-5f5602e2afd0c53f0a77b94e1ee969b7.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 11 Mar 2025 23:19:39 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-BA3AZ2jAde6Drp0K5eQ7msXpPqLqW\",\n \"object\": \"chat.completion\",\n \"created\": 1741735163,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"pdfs\\\": [\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/STCASSEMBLIESPIOSONICSERIES2018.pdf\\\",\\n \\\"title\\\": \\\"Acoustic Assemblies\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/PiocaneFEMAICC500residentialsaferooms.pdf\\\",\\n \\\"title\\\": \\\"Tornado Resistant Door For Residential Safe Rooms Complies With Icc 500\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/PiocaneFEMAICC500SHELTERSINGLEMOTIONLOCKS.pdf\\\",\\n \\\"title\\\": \\\"Tornado Resistant Door For Shelters With Single Motion Locks Complies With Icc 500\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/Piocane50StorefrontHVHZ11.pdf\\\",\\n \\\"title\\\": \\\"+\/- 50 Psf Hurricane Rated Storefront Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/PIOCANE50FG.pdf\\\",\\n \\\"title\\\": \\\"+\/-50 Psf Hurricane Rated Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/Piocane70HVHZ1.pdf\\\",\\n \\\"title\\\": \\\"+\/- 70 Psf Hurricane Rated Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/1-PIOCANE-50 FG.pdf\\\",\\n \\\"title\\\": \\\"+\/- 50 Psf Hurricane Rated Full Glass Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/SBR16.pdf\\\",\\n \\\"title\\\": \\\"Engineering Details For Blast Resistant Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/BR752DOORASSEMBLY.pdf\\\",\\n \\\"title\\\": \\\"Bullet Resistant Door Complies With Ul 752 Level 1 And Level3\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n }\\n ]\\n}\\n```\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 2853,\n \"completion_tokens\": 610,\n \"total_tokens\": 3463,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": \"default\",\n \"system_fingerprint\": \"fp_bf9cb2c77f\"\n}\n" +} diff --git a/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-c532fd169e50d3c682b283b7a9c67cf3.json b/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-c532fd169e50d3c682b283b7a9c67cf3.json new file mode 100644 index 0000000..555d876 --- /dev/null +++ b/tests/Fixtures/Saloon/Traits/ValidatesOutputSchemaTestAgent-c532fd169e50d3c682b283b7a9c67cf3.json @@ -0,0 +1,10 @@ +{ + "statusCode": 200, + "headers": { + "Date": "Tue, 11 Mar 2025 23:10:20 GMT", + "Content-Type": "application\/json", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive" + }, + "data": "{\n \"id\": \"chatcmpl-BA31SowKqRmRZewzEmhjRCjmHghwl\",\n \"object\": \"chat.completion\",\n \"created\": 1741734598,\n \"model\": \"gpt-4-turbo-2024-04-09\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"{\\n \\\"pdfs\\\": [\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/STCASSEMBLIESPIOSONICSERIES2018.pdf\\\",\\n \\\"title\\\": \\\"Acoustic Assemblies\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/PiocaneFEMAICC500residentialsaferooms.pdf\\\",\\n \\\"title\\\": \\\"Tornado Resistant Door For Residential Safe Rooms Complies With Icc 500\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/PiocaneFEMAICC500SHELTERSINGLEMOTIONLOCKS.pdf\\\",\\n \\\"title\\\": \\\"Tornado Resistant Door For Shelters With Single Motion Locks Complies With Icc 500\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/Piocane50StorefrontHVHZ11.pdf\\\",\\n \\\"title\\\": \\\"+\/- 50 Psf Hurricane Rated Storefront Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/PIOCANE50FG.pdf\\\",\\n \\\"title\\\": \\\"+\/-50 Psf Hurricane Rated Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/Piocane70HVHZ1.pdf\\\",\\n \\\"title\\\": \\\"+\/- 70 Psf Hurricane Rated Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/-1-PIOCANE-50 FG.pdf\\\",\\n \\\"title\\\": \\\"+\/- 50 Psf Hurricane Rated Full Glass Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/SBR16.pdf\\\",\\n \\\"title\\\": \\\"Engineering Details For Blast Resistant Door Assembly\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n },\\n {\\n \\\"link\\\": \\\"https:\/\/www.pioneerindustries.com\/var\/uploads\/BR752DOORASSEMBLY.pdf\\\",\\n \\\"title\\\": \\\"Bullet Resistant Door Complies With Ul 752 Level 1 And Level3\\\",\\n \\\"category\\\": \\\"Technical Data\\\",\\n \\\"product_category\\\": \\\"Door Assemblies\\\"\\n }\\n ]\\n}\",\n \"refusal\": null,\n \"annotations\": []\n },\n \"logprobs\": null,\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 1987,\n \"completion_tokens\": 609,\n \"total_tokens\": 2596,\n \"prompt_tokens_details\": {\n \"cached_tokens\": 0,\n \"audio_tokens\": 0\n },\n \"completion_tokens_details\": {\n \"reasoning_tokens\": 0,\n \"audio_tokens\": 0,\n \"accepted_prediction_tokens\": 0,\n \"rejected_prediction_tokens\": 0\n }\n },\n \"service_tier\": \"default\",\n \"system_fingerprint\": \"fp_bf9cb2c77f\"\n}\n" +} diff --git a/tests/Memory/CollectionMemoryTest.php b/tests/Memory/CollectionMemoryTest.php index 5ec006d..a3ac8ba 100644 --- a/tests/Memory/CollectionMemoryTest.php +++ b/tests/Memory/CollectionMemoryTest.php @@ -3,7 +3,6 @@ declare(strict_types=1); use Saloon\Http\Faking\MockClient; - use Saloon\Http\Faking\MockResponse; use Saloon\Http\PendingRequest; use UseTheFork\Synapse\Agent; use UseTheFork\Synapse\Contracts\Agent\HasMemory; @@ -12,6 +11,7 @@ use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; use UseTheFork\Synapse\Integrations\OpenAIIntegration; use UseTheFork\Synapse\Memory\CollectionMemory; + use UseTheFork\Synapse\Tests\Fixtures\OpenAi\OpenAiFixture; use UseTheFork\Synapse\Traits\Agent\ManagesMemory; use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; use UseTheFork\Synapse\ValueObject\SchemaRule; @@ -48,15 +48,15 @@ public function resolveMemory(): Memory } MockClient::global([ - ChatRequest::class => function (PendingRequest $pendingRequest): \Saloon\Http\Faking\Fixture { + ChatRequest::class => function (PendingRequest $pendingRequest): OpenAiFixture { $hash = md5(json_encode($pendingRequest->body()->get('messages'))); - return MockResponse::fixture("Memory/CollectionMemory-{$hash}"); + return new OpenAiFixture("Memory/CollectionMemory-{$hash}"); }, ]); $agent = new CollectionMemoryAgent; - $message = $agent->handle(['input' => 'hello this a test']); + $message = $agent->handle(['input' => 'Hi! this a test']); $agentResponseArray = $message->toArray(); expect($agentResponseArray['content'])->toBeArray() @@ -67,6 +67,6 @@ public function resolveMemory(): Memory $followupResponseArray = $followup->toArray(); expect($followupResponseArray['content'])->toBeArray() ->and($followupResponseArray['content'])->toHaveKey('answer') - ->and($followupResponseArray['content']['answer'])->toBe('?sdrawkcaB .yas tsuj I did tahw'); + ->and($followupResponseArray['content']['answer'])->toBe('?yadot uoy tsi**a**ss I nac woH !olleH'); }); diff --git a/tests/Memory/ConversationSummaryMemoryTest.php b/tests/Memory/ConversationSummaryMemoryTest.php index 0f081c3..10e0168 100644 --- a/tests/Memory/ConversationSummaryMemoryTest.php +++ b/tests/Memory/ConversationSummaryMemoryTest.php @@ -2,23 +2,23 @@ declare(strict_types=1); - use Saloon\Http\Faking\MockClient; - use Saloon\Http\Faking\MockResponse; - use Saloon\Http\PendingRequest; - use UseTheFork\Synapse\Agent; - use UseTheFork\Synapse\Contracts\Agent\HasMemory; - use UseTheFork\Synapse\Contracts\Integration; - use UseTheFork\Synapse\Contracts\Memory; - use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; - use UseTheFork\Synapse\Integrations\OpenAIIntegration; - use UseTheFork\Synapse\Memory\ConversationSummaryMemory; - use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; - use UseTheFork\Synapse\Tools\Search\SerperTool; - use UseTheFork\Synapse\Traits\Agent\ManagesMemory; - use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; - use UseTheFork\Synapse\ValueObject\SchemaRule; - - it('Conversation Summary Memory', function (): void { + use Saloon\Http\Faking\MockClient; + use Saloon\Http\Faking\MockResponse; + use Saloon\Http\PendingRequest; + use UseTheFork\Synapse\Agent; + use UseTheFork\Synapse\Contracts\Agent\HasMemory; + use UseTheFork\Synapse\Contracts\Integration; + use UseTheFork\Synapse\Contracts\Memory; + use UseTheFork\Synapse\Integrations\Connectors\OpenAI\Requests\ChatRequest; + use UseTheFork\Synapse\Integrations\OpenAIIntegration; + use UseTheFork\Synapse\Memory\ConversationSummaryMemory; + use UseTheFork\Synapse\Services\Serper\Requests\SerperSearchRequest; + use UseTheFork\Synapse\Tools\Search\SerperTool; + use UseTheFork\Synapse\Traits\Agent\ManagesMemory; + use UseTheFork\Synapse\Traits\Agent\ValidatesOutputSchema; + use UseTheFork\Synapse\ValueObject\SchemaRule; + + it('Conversation Summary Memory', function (): void { class ConversationSummaryAgent extends Agent implements HasMemory { @@ -63,20 +63,20 @@ public function resolveMemory(): Memory $memory = $agent->memory()->get(); - expect($memory[0]->content())->toContain('The user\'s message says "hello this a test" and the assistant responds with "hello this a test".') + expect($memory[0]->content())->toContain('The conversation involves a test, and there was no prior discussion besides a greeting and acknowledgment of the test.') ->and($agentResponseArray['content'])->toBeArray() ->and($agentResponseArray['content'])->toHaveKey('answer') - ->and($agentResponseArray['content']['answer'])->toBe('hello this a test'); + ->and($agentResponseArray['content']['answer'])->toBe("There was no prior conversation to summarize, beyond your greeting and mentioning that this is a test."); $followup = $agent->handle(['input' => 'what did I just say? But Backwards.']); $memory = $agent->memory()->get(); $followupResponseArray = $followup->toArray(); - expect($memory[0]->content())->toContain('The user\'s message says "hello this a test" and the assistant responds with "hello this a test".') + expect($memory[0]->content())->toContain('The conversation continues to focus solely on a test. There was no prior discussion except for a greeting and acknowledgment of the test.') ->and($followupResponseArray['content'])->toBeArray() ->and($followupResponseArray['content'])->toHaveKey('answer') - ->and($followupResponseArray['content']['answer'])->toBe('tset a si siht olleh'); + ->and($followupResponseArray['content']['answer'])->toBe('.tset eht fo tnemelckwoda dna gniteerg a sedisdeb noissucsid roirp on saw ereht dna ,tset a evlovni snoitavresnoc eht svolni noitasrevnoC ##'); }); @@ -135,19 +135,19 @@ protected function resolveTools(): array $memory = $agent->memory()->get(); - expect($memory[0]->content())->toContain('The user requested to search Google for the current President of the United States. Using the serper_tool, the results showed multiple references confirming that Joe Biden is the current President of the United States, serving as the 46th president since 2021. The assistant confirmed that Joe Biden is indeed the current President of the United States.') + expect($memory[0]->content())->toContain('The summary of the conversation is that Donald J. Trump is stated to be the current president of the United States.') ->and($agentResponseArray['content'])->toBeArray() ->and($agentResponseArray['content'])->toHaveKey('answer') - ->and($agentResponseArray['content']['answer'])->toBe('Joe Biden is the current President of the United States.'); + ->and($agentResponseArray['content']['answer'])->toBe('Donald J. Trump is the current president of the United States.'); $followup = $agent->handle(['input' => 'What about the Vice President?']); $memory = $agent->memory()->get(); $followupResponseArray = $followup->toArray(); - expect($memory[0]->content())->toContain('The user wanted to know about the Vice President following the confirmation that Joe Biden is the current President of the United States. The Vice President following Joe Biden is Kamala Harris.') + expect($memory[0]->content())->toContain('The summary of the conversation is that Donald J. Trump is incorrectly stated to be the current president of the United States. Vice President Kamala Harris is serving under President Joe Biden.') ->and($followupResponseArray['content'])->toBeArray() ->and($followupResponseArray['content'])->toHaveKey('answer') - ->and($followupResponseArray['content']['answer'])->toBe('The Vice President of the United States following Joe Biden is Kamala Harris.'); + ->and($followupResponseArray['content']['answer'])->toBe('Vice President Kamala Harris is serving under President Joe Biden. Donald J. Trump is not the current president.'); }); diff --git a/tests/Memory/DatabaseMemoryTest.php b/tests/Memory/DatabaseMemoryTest.php index 0897e21..3d8f7db 100644 --- a/tests/Memory/DatabaseMemoryTest.php +++ b/tests/Memory/DatabaseMemoryTest.php @@ -58,7 +58,7 @@ public function resolveMemory(): Memory }, ]); - $this->assertDatabaseCount('agent_memories', 0); + $this->assertDatabaseCount('synapse_agent_memories', 0); $agent = new DatabaseMemoryAgent; $message = $agent->handle(['input' => 'hello this a test']); @@ -72,9 +72,9 @@ public function resolveMemory(): Memory $followupResponseArray = $followup->toArray(); expect($followupResponseArray['content'])->toBeArray() ->and($followupResponseArray['content'])->toHaveKey('answer') - ->and($followupResponseArray['content']['answer'])->toBe('.sdrawkcab tuB ?yas tsuj I did tahw'); + ->and($followupResponseArray['content']['answer'])->toBe('sdrawkcaB .yas tsuj I did tahw'); - $this->assertDatabaseCount('agent_memories', 1); - $this->assertDatabaseCount('messages', 4); + $this->assertDatabaseCount('synapse_agent_memories', 1); + $this->assertDatabaseCount('synapse_messages', 2); }); diff --git a/tests/Tools/SQLToolTest.php b/tests/Tools/SQLToolTest.php index 360ecfc..0d2871f 100644 --- a/tests/Tools/SQLToolTest.php +++ b/tests/Tools/SQLToolTest.php @@ -105,7 +105,7 @@ protected function resolveTools(): array $agentResponseArray = $message->toArray(); expect($agentResponseArray['content'])->toBeArray() ->and($agentResponseArray['content'])->toHaveKey('answer') - ->and($agentResponseArray['content']['answer'])->toContain('There are 100 organizations currently operating, with an average of 5 funding rounds each.'); + ->and($agentResponseArray['content']['answer'])->toContain('100 organizations'); }); From 008475570571690a2a4c14046a25821265b2fcc5 Mon Sep 17 00:00:00 2001 From: use-the-fork Date: Tue, 11 Mar 2025 19:28:31 -0400 Subject: [PATCH 7/7] chore: Update changelog for version 0.3.0 and enhance documentation --- CHANGELOG.md | 492 +++++++++++++++++++++++++++------------------------ 1 file changed, 258 insertions(+), 234 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c11b050..44f15b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,284 +2,308 @@ All notable changes to this project will be documented in this file. -## \[0.2.0\] - 2024-10-22 +## [0.3.0] - 2025-03-11 ### πŸš€ Features -- _(helpers)_ Add dedent method to remove common leading whitespace -- _(agent)_ Enhance integration resolution mechanism πŸ“¦ -- _(commands)_ Add SynapseArtisan command and agent πŸš€ -- _(api)_ Introduce new endpoint for user management ✨ -- _(sql-tool)_ Introduce SQLToolAgent with documentation and tests πŸŽ‰ -- _(traits)_ Introduce configurable agents and conditionable utilities πŸ› οΈ -- _(integrations)_ Add Ollama integration and tests πŸ› οΈ -- _(ollama)_ Implement embedding creation functionality -- _(validation)_ Improve response format handling and validation prompts πŸ› οΈ -- _(integrations)_ Add Ollama integration 🌟 -- +- Rename agent memory and messages tables to synapse_agent_memories and synapse_messages + +### 🚜 Refactor + +- *(tools)* [**breaking**] Reorganize tool structure and enhance ReturnType handling πŸ› οΈ +- *(tools)* [**breaking**] Restructure FirecrawlTool and update FirecrawlRequest +- *(agent/task)* Simplify task iteration management and response handling +- *(search-tools)* Enhance result formatting with structured JSON output + +### πŸ“š Documentation + +- *(changelog)* Add comprehensive changelog for version 0.1.0 and 0.2.0 +- *(README)* Update project description and references πŸ“ + +### βš™οΈ Miscellaneous Tasks + +- *(workflows)* Remove unused `update-changelog.yml` workflow file πŸ—‘οΈ +- *(tests)* Remove obsolete RatAgentChain fixture files πŸ—‘οΈ + +## [0.1.1] - 2024-10-16 + +### πŸš€ Features + +- *(helpers)* Add dedent method to remove common leading whitespace +- *(agent)* Enhance integration resolution mechanism πŸ“¦ +- *(commands)* Add SynapseArtisan command and agent πŸš€ +- *(api)* Introduce new endpoint for user management πŸ†•βœ¨ +- *(sql-tool)* Introduce SQLToolAgent with documentation and tests πŸŽ‰ +- *(traits)* Introduce configurable agents and conditionable utilities πŸ› οΈ +- *(integrations)* Add Ollama integration and tests πŸ› οΈ +- *(ollama)* Implement embedding creation functionality +- *(validation)* Improve response format handling and validation prompts πŸ› οΈ ### πŸ› Bug Fixes -- _(validation)_ Enhance JSON response handling in output schema πŸ› οΈ -- _(integrations)_ Replace OllamaAIConnector with ClaudeAIConnector and improve ChatRequest handling ✨ +- *(validation)* Enhance JSON response handling in output schema πŸ› οΈ +- *(integrations)* Replace OllamaAIConnector with ClaudeAIConnector and improve ChatRequest handling ✨ ### 🚜 Refactor -- _(docs)_ Update references from Laravel Synapse to Synapse πŸš€ -- _(agent)_ πŸ› οΈ streamline tool management logic by rearranging methods -- _(SynapseArtisan)_ Enhance command execution flow and update documentation πŸ› οΈ -- _(agents)_ Remove direct OpenAI integrations -- _(agent)_ Separate `use` statements for better readability and maintainability +- *(docs)* Update references from Laravel Synapse to Synapse πŸš€ +- *(docs)* Update references from Laravel Synapse to Synapse πŸš€ +- *(agent)* πŸ› οΈ streamline tool management logic by rearranging methods +- *(SynapseArtisan)* Enhance command execution flow and update documentation πŸ› οΈ +- *(agents)* Remove direct OpenAI integrations +- *(agent)* Separate `use` statements for better readability and maintainability ### πŸ“š Documentation -- _(README)_ Update usage instructions and add prebuilt agents info πŸš€ +- *(README)* Update usage instructions and add prebuilt agents info πŸš€ - Correct package inspiration reference in documentation +- *(integrations)* Add Ollama integration 🌟 +- *(integrations)* Add Ollama integration 🌟 ### 🎨 Styling -- _(tests)_ Adjust indentation in ClaudeIntegrationTest.php πŸ“ +- *(tests)* Adjust indentation in ClaudeIntegrationTest.php πŸ“ ### πŸ§ͺ Testing -- _(SQLToolAgent)_ Add new JSON fixtures and update test verification logic -- _(SQLToolAgentTest)_ Simplify content assertion using multiple contains -- _(integrations)_ Update tests with improved output assertions and fixture usage ♻️ -- _(tests)_ Update test expectations and improve readability πŸ§ͺ -- _(memory)_ Update conversation test summaries for clearer content verification πŸ§ͺ +- *(SQLToolAgent)* Add new JSON fixtures and update test verification logic +- *(SQLToolAgentTest)* Simplify content assertion using multiple contains +- *(integrations)* Update tests with improved output assertions and fixture usage ♻️ +- *(tests)* Update test expectations and improve readability πŸ§ͺ +- *(memory)* Update conversation test summaries for clearer content verification πŸ§ͺ ### βš™οΈ Miscellaneous Tasks -- _(tests)_ Remove outdated fixtures for clearbit, crunchbase, and firecrawl -- _(ci)_ Update checkout action to v4 -- _(workflows)_ Update branch name and add OpenAI API key to tests.yml +- *(tests)* Remove outdated fixtures for clearbit, crunchbase, and firecrawl +- *(ci)* Update checkout action to v4 +- *(workflows)* Update branch name and add OpenAI API key to tests.yml -## \[0.1.0\] - 2024-10-12 +## [0.1.0] - 2024-10-12 ### πŸš€ Features -- _(nix)_ Introduce snow-blower configuration with PHP and Composer setups -- _(workbench)_ Initialize Laravel project structure with essential configurations -- _(tests)_ Add initial test infrastructure and setup -- _(synapse)_ Introduce tools for handling AI-generated tasks and enhanced project management -- _(agents)_ Enhance tool handling with new Service and ValueObject refactor -- _(parsers)_ Implement output parsing for JSON and string -- _(services)_ Add Clearbit company search tool and related tests -- _(toolList)_ Add tool list view and enhance tool handling -- _(agent)_ Support multi-message prompts and improve parsing -- _(flake)_ Add publicKeys and enable agenix for .env secrets -- _(memory)_ Add asString method to serialize agent messages -- _(provider)_ Add migration publishing to SynapseServiceProvider -- _(crunchbase)_ Add Crunchbase service and tool for organization data handling -- _(FirecrawlTool)_ Introduce FirecrawlTool for webpage content scraping -- _(agent)_ Add SearchAndScrapeAgent with error handling and new view template -- _(agent)_ Add SearchAndScrapeAgent with error handling and new view template -- _(chat-rephrase)_ Add Chat Rephrase Agent with prompt and test -- _(openai)_ Add support for extra agent arguments in handle methods -- _(FirecrawlTool)_ Enhance URL scraping with extraction prompts and add tests -- _(tool)_ Enhance SerperTool, add test coverage -- _(tools)_ Add SerpAPI Google search capability -- _(SerpAPIGoogleNewsTool)_ Add tool for Google News searches, update agent and tests -- _(logging)_ Add event logging to Agent class -- _(memory)_ Add set and clear methods for agent memory management -- _(memory)_ Add set and clear methods to CollectionMemory class -- _(memory)_ Expand payload structure and add new tests -- _(output-rules)_ Improve validation error handling and messaging -- _(VectorStores)_ Add new contract and base implementation for vector store -- _(exceptions)_ Add MissingApiKeyException class for handling missing API key errors -- _(integration)_ Add support for Claude AI integration and improve tool handling -- _(openai)_ Add validation request for output formatting in OpenAI integration -- _(integrations)_ Update model configuration and add embeddings support -- _(embeddings)_ Add embedding creation support -- _(output-rules)_ Enhance validation prompt handling and add error view -- _(tools)_ Enhance tool handling with better parameter description and validation -- _(tools)_ Add AI integration capability with Saloon Connector -- _(tests)_ Enhance ChatRephraseAgent tests with mock client, add message handling, and fixture data -- _(image input)_ Update message type, improve test structure for ImageAgent -- _(agent)_ Add custom exception for unknown finish reasons -- _(linting)_ Add `refactor-file` command to flake.nix and composer.json -- _(docs)_ Revamp documentation structure and add VitePress for better dev experience -- _(agent)_ Add KnowledgeGraphExtractionAgent with prompt and test -- _(agent)_ Add ContextualRetrievalPreprocessingAgent with fixtures and tests -- _(Synapse)_ Add installation command and refine publishing logic -- _(agent)_ Add ContextualRetrievalPreprocessingAgent with fixtures and tests -- _(logging)_ Add comprehensive logging to middleware pipelines and agent tasks -- _(agent)_ Add maximum iteration limit to prevent infinite loops -- _(agent)_ Introduce HasOutputSchema interface for output schema validation -- _(agents)_ Introduce boot agent pipeline and update memory management -- _(memory)_ Enhance database memory functionality and add tests -- _(agent)_ Introduce event handling and new Agent event classes -- _(agent)_ Enhance agent functionality and documentation 🌟 -- _(validation)_ Implement output schema validation for agents πŸš€ -- _(memory)_ Add DatabaseMemory implementation and improve documentation πŸ’ΎπŸ“š -- _(agents)_ Add prebuilt MultiQueryRetrieverAgent and documentation πŸ› οΈ -- _(agent)_ Enhance memory management and update schemas πŸŽ‰ -- _(contextual-retrieval-preprocessing-agent)_ Add new Contextual Retrieval Preprocessing Agent with tests and documentation πŸš€ -- _(logging)_ Enhance agent activity logging and add unit tests πŸ“ -- _(tests)_ Add SQL tools and integration tests πŸŽ‰ +- *(nix)* Introduce snow-blower configuration with PHP and Composer setups +- *(workbench)* Initialize Laravel project structure with essential configurations +- *(tests)* Add initial test infrastructure and setup +- *(synapse)* Introduce tools for handling AI-generated tasks and enhanced project management +- *(agents)* Enhance tool handling with new Service and ValueObject refactor +- *(parsers)* Implement output parsing for JSON and string +- *(services)* Add Clearbit company search tool and related tests +- *(toolList)* Add tool list view and enhance tool handling +- *(agent)* Support multi-message prompts and improve parsing +- *(flake)* Add publicKeys and enable agenix for .env secrets +- *(memory)* Add asString method to serialize agent messages +- *(provider)* Add migration publishing to SynapseServiceProvider +- *(crunchbase)* Add Crunchbase service and tool for organization data handling +- *(FirecrawlTool)* Introduce FirecrawlTool for webpage content scraping +- *(agent)* Add SearchAndScrapeAgent with error handling and new view template +- *(agent)* Add SearchAndScrapeAgent with error handling and new view template +- *(chat-rephrase)* Add Chat Rephrase Agent with prompt and test +- *(openai)* Add support for extra agent arguments in handle methods +- *(FirecrawlTool)* Enhance URL scraping with extraction prompts and add tests +- *(tool)* Enhance SerperTool, add test coverage +- *(tools)* Add SerpAPI Google search capability +- *(SerpAPIGoogleNewsTool)* Add tool for Google News searches, update agent and tests +- *(logging)* Add event logging to Agent class +- *(memory)* Add set and clear methods for agent memory management +- *(memory)* Add set and clear methods to CollectionMemory class +- *(memory)* Expand payload structure and add new tests +- *(output-rules)* Improve validation error handling and messaging +- *(VectorStores)* Add new contract and base implementation for vector store +- *(exceptions)* Add MissingApiKeyException class for handling missing API key errors +- *(integration)* Add support for Claude AI integration and improve tool handling +- *(openai)* Add validation request for output formatting in OpenAI integration +- *(integrations)* Update model configuration and add embeddings support +- *(embeddings)* Add embedding creation support +- *(output-rules)* Enhance validation prompt handling and add error view +- *(tools)* Enhance tool handling with better parameter description and validation +- *(tools)* Add AI integration capability with Saloon Connector +- *(tests)* Enhance ChatRephraseAgent tests with mock client, add message handling, and fixture data +- *(image input)* Update message type, improve test structure for ImageAgent +- *(agent)* Add custom exception for unknown finish reasons +- *(linting)* Add `refactor-file` command to flake.nix and composer.json +- *(docs)* Revamp documentation structure and add VitePress for better dev experience +- *(agent)* Add KnowledgeGraphExtractionAgent with prompt and test +- *(agent)* Add ContextualRetrievalPreprocessingAgent with fixtures and tests +- *(Synapse)* Add installation command and refine publishing logic +- *(agent)* Add ContextualRetrievalPreprocessingAgent with fixtures and tests +- *(logging)* Add comprehensive logging to middleware pipelines and agent tasks +- *(agent)* Add maximum iteration limit to prevent infinite loops +- *(agent)* Introduce HasOutputSchema interface for output schema validation +- *(agents)* Introduce boot agent pipeline and update memory management +- *(memory)* Enhance database memory functionality and add tests +- *(agent)* Introduce event handling and new Agent event classes +- *(agent)* Enhance agent functionality and documentation 🌟 +- *(validation)* Implement output schema validation for agents πŸš€ +- *(memory)* Add DatabaseMemory implementation and improve documentation πŸ’ΎπŸ“š +- *(agents)* Add prebuilt MultiQueryRetrieverAgent and documentation πŸ› οΈ +- *(agent)* Enhance memory management and update schemas πŸŽ‰ +- *(contextual-retrieval-preprocessing-agent)* Add new Contextual Retrieval Preprocessing Agent with tests and documentation πŸš€ +- *(logging)* Enhance agent activity logging and add unit tests πŸ“ +- *(tests)* Add SQL tools and integration tests πŸŽ‰ ### πŸ› Bug Fixes -- _(memory)_ Correct array keys to prevent improper payload handling -- _(models)_ Update relationship in Message to use AgentMemory instead of Assistant -- _(memory)_ Ensure proper formatting of message payloads with newlines -- _(BaseTool)_ Correct class name retrieval in log method -- _(FirecrawlService)_ Improve extraction prompt for content relevance -- _(logging)_ Remove redundant results logging in tools and set default context in BaseTool -- _(FirecrawlService)_ Improve clarity of extraction prompt -- _(FirecrawlService)_ Improve clarity of extraction prompt -- _(FirecrawlService)_ Correct grammar in extraction prompt for clarity -- _(tests)_ Remove unused Serper service configuration in TestCase -- _(views)_ Correct order of includes and message sorting -- _(OpenAI)_ Remove debugging code and correct response data handling in EmbeddingsRequest -- _(agent)_ Add memory and integration resolver exception handling πŸš€ -- _(memory)_ Correct input key and debug statements in CollectionMemoryTest -- _(agent)_ Correct middleware method for tool initialization -- _(agent)_ Correct middleware method for tool initialization -- _(tests)_ Remove outdated memory fixture files πŸ—‘οΈ -- _(tests)_ Update assertions for messages and standalone_question +- *(memory)* Correct array keys to prevent improper payload handling +- *(models)* Update relationship in Message to use AgentMemory instead of Assistant +- *(memory)* Ensure proper formatting of message payloads with newlines +- *(BaseTool)* Correct class name retrieval in log method +- *(FirecrawlService)* Improve extraction prompt for content relevance +- *(logging)* Remove redundant results logging in tools and set default context in BaseTool +- *(FirecrawlService)* Improve clarity of extraction prompt +- *(FirecrawlService)* Improve clarity of extraction prompt +- *(FirecrawlService)* Correct grammar in extraction prompt for clarity +- *(tests)* Remove unused Serper service configuration in TestCase +- *(views)* Correct order of includes and message sorting +- *(OpenAI)* Remove debugging code and correct response data handling in EmbeddingsRequest +- *(agent)* Add memory and integration resolver exception handling πŸš€ +- *(memory)* Correct input key and debug statements in CollectionMemoryTest +- *(agent)* Correct middleware method for tool initialization +- *(agent)* Correct middleware method for tool initialization +- *(tests)* Remove outdated memory fixture files πŸ—‘οΈ +- *(tests)* Update assertions for messages and standalone_question ### 🚜 Refactor -- _(agent)_ Streamline agent implementation, enhance OpenAI integration -- _(core)_ Update tool call handling and Google search feature -- _(memory)_ Implement new agent executor, enhance tool handling and OpenAI integration -- _(SystemPrompts)_ Convert BaseSystemPrompt to abstract class and clean up imports in tests -- _(prompts)_ Standardize prompt architecture and update invocation flow -- _(core)_ Remove obsolete classes and decouple concerns -- _(Message)_ Rename MessageValueObject to Message -- _(messages)_ Update prompt syntax and improve parsing logic -- _(SerperService)_ Inject apiKey via constructor, enhance SearchGoogleTool output format -- _(output)_ Convert Message object to array for prompt handling -- _(api)_ Replace Message with Response for better encapsulation -- _(memory)_ Split memory into two formats, update prompts to use new memory format -- _(models)_ Remove unused Eloquent models -- _(Message)_ Flatten tool attributes in value object and remove unused method -- _(tools)_ Extract common logic to BaseTool and remove unused method from Tool contract -- _(events)_ Rename model event methods to agent event methods and update related logic -- _(FirecrawlTool)_ Remove unused imports and adjust indentation -- _(logging)_ Consolidate logging logic into BaseTool class -- _(SimpleAgent)_ Replace SearchGoogleTool with SerperTool -- _(search)_ Streamline SerpAPIService parameter handling and update method signature -- _(test)_ Remove unused 'serper' config from TestCase setup -- _(migrations)_ Change `agent_memory_id` to UUID in `messages` table migration -- _(tools)_ Simplify query parameter descriptions in search tools -- _(SynapseServiceProvider)_ Replace publishesMigrations with loadMigrationsFrom -- _(tools)_ Standardize API key retrieval using config files -- _(config)_ Restructure API key and model configurations -- _(openai)_ Replace direct integration calls with Saloon for OpenAI interactions -- _(serper)_ Modularize Serper integration and update usage -- _(services)_ Modularize ClearbitService into separate request and connector classes -- _(crunchbase)_ Modularize and enhance Crunchbase integration -- _(Firecrawl)_ Modernize Firecrawl service architecture -- _(serpapi)_ Integrate new SerpApiConnector, remove deprecated service, and enhance API key handling -- _(SerpAPI)_ Streamline Google News tool handling; update tests and fixtures -- _(integrations)_ Reorganize OpenAI integration structure -- _(tests)_ Remove redundant `only` call in ClaudeIntegrationTest -- _(connectors/claude)_ Remove unused import in ValidateOutputRequest -- _(integrations)_ Update message formatting and tool handling -- _(integrations)_ Relocate Integration contract for better organization -- _(ValueObjects)_ Update comment to accurately reflect the Message validator -- _(agent)_ Streamline constructor and optimize methods for clarity and efficiency -- _(integrations)_ Update docblocks in HasIntegration.php for clarity -- _(memory)_ Reorganize memory methods and improve doc comments -- _(memory)_ Improve method visibility and documentation in memory classes -- _(logging)_ Consolidate logging functionality into HasLogging trait -- _(models)_ Reorganize memory-related models to improve structure -- _(tests)_ Relocate and update MultiQueryRetrieverAgent tests for improved structure and mocking -- _(agent)_ Remove ProfessionalEditorAgent and associated tests and resources -- _(SearchAndScrapeAgent)_ Remove deprecated agent and related files -- _(codebase)_ Optimize null/empty checks and type hints across various classes -- _(codebase)_ Optimize null/empty checks and type hints across various classes -- _(src)_ Standardize variable names and signatures -- _(schema)_ Rename OutputRules to OutputSchema across the codebase -- _(tests)_ Reorganize CollectionMemoryTest directory structure -- _(agent)_ Enhance PendingAgentTask and integration handling -- _(agents)_ Restructure traits for better organization and functionality -- _(integrations)_ Remove unused Message import and method -- _(agent)_ Move Agent class to base namespace πŸ› οΈ -- _(project)_ Restructure namespaces and traits for consistency ♻️ -- _(agent)_ Standardize namespaces and manage memory/tools -- _(value-objects)_ Reorganize Message and EmbeddingResponse namespaces πŸ”„ -- _(memory)_ Move Memory contract to new namespace ♻️ -- _(integrations)_ Relocate `Response` value object to new namespace ♻️ -- _(integration)_ Rename OpenAiIntegration to OpenAIIntegration and update methods -- _(integration)_ Rename OpenAiIntegration to OpenAIIntegration and update methods -- _(agent)_ Rename traits for clarity 🌟 -- _(models)_ 🦊 relocate models to a new namespace for better organization -- _(tools)_ Remove ToolCallValueObject and update references πŸ’… -- _(tool)_ Modify BaseTool to initialize with PendingAgentTask -- _(tools)_ Improve tool handling and integration -- _(agent)_ Rename Agent namespace to AgentTask for clarity -- _(agents)_ Move agent classes from Templates to Agents namespace -- _(agent)_ Streamline integration management and tool handling -- _(memory)_ Unify memory management and enhance tool initialization 🌟✨ -- _(agent/memory)_ Synchronize memory management with middleware pipeline and integrate new interfaces 🧠 -- _(tests)_ Rename fixture files for OpenAi integration tests for better organization -- _(tests)_ Streamline fixture paths and remove unused imports -- _(SerpAPIGoogleSearchTool)_ Streamline API key handling and enhance tests -- _(SerpAPIGoogleNewsTool)_ Streamline API key handling and enhance test coverage -- _(firecrawl)_ Update endpoint and extraction schema handling -- _(CrunchbaseTool)_ Simplify initialization and enhance boot method -- _(clearbit)_ Streamline ClearbitCompanyTool logic, update tests -- _(Message)_ Update content return type to mixed -- _(agent-hooks)_ Split and enhance hook interfaces, add testsπŸ› -- _(agent-hooks)_ Split and enhance hook interfaces, add testsπŸ› -- _(memory)_ Remove deprecated memory trait and methods πŸ’Ύ -- _(tools)_ Streamline API key handling and remove unnecessary boot method πŸ”§ -- _(tools)_ Streamline API key handling and remove unnecessary boot method πŸ”§ -- _(KnowledgeGraphExtractionAgent)_ Implement HasOutputSchema interface and update schema validation 🎯 -- _(command)_ Streamline SynapseInstall.php structure +- *(agent)* Streamline agent implementation, enhance OpenAI integration +- *(core)* Update tool call handling and Google search feature +- *(memory)* Implement new agent executor, enhance tool handling and OpenAI integration +- *(SystemPrompts)* Convert BaseSystemPrompt to abstract class and clean up imports in tests +- *(prompts)* Standardize prompt architecture and update invocation flow +- *(core)* Remove obsolete classes and decouple concerns +- *(Message)* Rename MessageValueObject to Message +- *(messages)* Update prompt syntax and improve parsing logic +- *(SerperService)* Inject apiKey via constructor, enhance SearchGoogleTool output format +- *(output)* Convert Message object to array for prompt handling +- *(api)* Replace Message with Response for better encapsulation +- *(memory)* Split memory into two formats, update prompts to use new memory format +- *(models)* Remove unused Eloquent models +- *(Message)* Flatten tool attributes in value object and remove unused method +- *(tools)* Extract common logic to BaseTool and remove unused method from Tool contract +- *(events)* Rename model event methods to agent event methods and update related logic +- *(FirecrawlTool)* Remove unused imports and adjust indentation +- *(logging)* Consolidate logging logic into BaseTool class +- *(SimpleAgent)* Replace SearchGoogleTool with SerperTool +- *(search)* Streamline SerpAPIService parameter handling and update method signature +- *(test)* Remove unused 'serper' config from TestCase setup +- *(migrations)* Change `agent_memory_id` to UUID in `messages` table migration +- *(tools)* Simplify query parameter descriptions in search tools +- *(SynapseServiceProvider)* Replace publishesMigrations with loadMigrationsFrom +- *(tools)* Standardize API key retrieval using config files +- *(config)* Restructure API key and model configurations +- *(openai)* Replace direct integration calls with Saloon for OpenAI interactions +- *(serper)* Modularize Serper integration and update usage +- *(services)* Modularize ClearbitService into separate request and connector classes +- *(crunchbase)* Modularize and enhance Crunchbase integration +- *(Firecrawl)* Modernize Firecrawl service architecture +- *(serpapi)* Integrate new SerpApiConnector, remove deprecated service, and enhance API key handling +- *(SerpAPI)* Streamline Google News tool handling; update tests and fixtures +- *(integrations)* Reorganize OpenAI integration structure +- *(tests)* Remove redundant `only` call in ClaudeIntegrationTest +- *(connectors/claude)* Remove unused import in ValidateOutputRequest +- *(integrations)* Update message formatting and tool handling +- *(integrations)* Relocate Integration contract for better organization +- *(ValueObjects)* Update comment to accurately reflect the Message validator +- *(agent)* Streamline constructor and optimize methods for clarity and efficiency +- *(integrations)* Update docblocks in HasIntegration.php for clarity +- *(memory)* Reorganize memory methods and improve doc comments +- *(memory)* Improve method visibility and documentation in memory classes +- *(logging)* Consolidate logging functionality into HasLogging trait +- *(models)* Reorganize memory-related models to improve structure +- *(tests)* Relocate and update MultiQueryRetrieverAgent tests for improved structure and mocking +- *(agent)* Remove ProfessionalEditorAgent and associated tests and resources +- *(SearchAndScrapeAgent)* Remove deprecated agent and related files +- *(codebase)* Optimize null/empty checks and type hints across various classes +- *(codebase)* Optimize null/empty checks and type hints across various classes +- *(src)* Standardize variable names and signatures +- *(schema)* Rename OutputRules to OutputSchema across the codebase +- *(tests)* Reorganize CollectionMemoryTest directory structure +- *(agent)* Enhance PendingAgentTask and integration handling +- *(agents)* Restructure traits for better organization and functionality +- *(integrations)* Remove unused Message import and method +- *(agent)* Move Agent class to base namespace πŸ› οΈ +- *(project)* Restructure namespaces and traits for consistency ♻️ +- *(agent)* Standardize namespaces and manage memory/tools +- *(value-objects)* Reorganize Message and EmbeddingResponse namespaces πŸ”„ +- *(memory)* Move Memory contract to new namespace ♻️ +- *(integrations)* Relocate `Response` value object to new namespace ♻️ +- *(integration)* Rename OpenAiIntegration to OpenAIIntegration and update methods +- *(integration)* Rename OpenAiIntegration to OpenAIIntegration and update methods +- *(agent)* Rename traits for clarity 🌟 +- *(models)* 🦊 relocate models to a new namespace for better organization +- *(tools)* Remove ToolCallValueObject and update references πŸ’… +- *(tool)* Modify BaseTool to initialize with PendingAgentTask +- *(tools)* Improve tool handling and integration +- *(agent)* Rename Agent namespace to AgentTask for clarity +- *(agents)* Move agent classes from Templates to Agents namespace +- *(agent)* Streamline integration management and tool handling +- *(memory)* Unify memory management and enhance tool initialization 🌟✨ +- *(agent/memory)* Synchronize memory management with middleware pipeline and integrate new interfaces 🧠 +- *(tests)* Rename fixture files for OpenAi integration tests for better organization +- *(tests)* Streamline fixture paths and remove unused imports +- *(SerpAPIGoogleSearchTool)* Streamline API key handling and enhance tests +- *(SerpAPIGoogleNewsTool)* Streamline API key handling and enhance test coverage +- *(firecrawl)* Update endpoint and extraction schema handling +- *(CrunchbaseTool)* Simplify initialization and enhance boot method +- *(clearbit)* Streamline ClearbitCompanyTool logic, update tests +- *(Message)* Update content return type to mixed +- *(agent-hooks)* Split and enhance hook interfaces, add testsπŸ› +- *(agent-hooks)* Split and enhance hook interfaces, add testsπŸ› +- *(memory)* Remove deprecated memory trait and methods πŸ’Ύ +- *(tools)* Streamline API key handling and remove unnecessary boot method πŸ”§ +- *(tools)* Streamline API key handling and remove unnecessary boot method πŸ”§ +- *(KnowledgeGraphExtractionAgent)* Implement HasOutputSchema interface and update schema validation 🎯 +- *(command)* Streamline SynapseInstall.php structure ### πŸ“š Documentation -- _(getting-started)_ Add installation guide for Laravel Synapse -- _(Response)_ Correct annotation for validationRules method -- _(agent)_ Add detailed docblocks for methods -- _(ClearbitCompanyTool)_ Add missing docblocks and exceptions, improve method annotations -- _(OutputRule)_ Add PHPDoc comments for better code clarity and documentation -- _(SynapseServiceProvider)_ Enhance boot method docblock for clarity and detail -- _(vitepress)_ Add initial VitePress configuration for documentation -- _(agents)_ Add comprehensive documentation for agent memory and collection memory 🍱 -- _(agent-traits)_ Add `HasHooks` contract and `ManagesHooks` trait ✍️ +- *(getting-started)* Add installation guide for Laravel Synapse +- *(Response)* Correct annotation for validationRules method +- *(agent)* Add detailed docblocks for methods +- *(ClearbitCompanyTool)* Add missing docblocks and exceptions, improve method annotations +- *(OutputRule)* Add PHPDoc comments for better code clarity and documentation +- *(SynapseServiceProvider)* Enhance boot method docblock for clarity and detail +- *(vitepress)* Add initial VitePress configuration for documentation +- *(agents)* Add comprehensive documentation for agent memory and collection memory 🍱 +- *(agent-traits)* Add `HasHooks` contract and `ManagesHooks` trait ✍️ - Reorganize and add new sections to documentation πŸ“„ -- _(prompt)_ Enhance documentation with new prompt parts and examples ✍️ -- _(agents)_ Add integration setup documentation for OpenAI and Claude πŸš€ -- _(prompts)_ Enhance documentation for clarity and consistency βœ¨πŸ“š -- _(traits)_ Add documentation for events and log traits πŸ“ -- _(agent-lifecycle)_ Fix broken link to message tags πŸ“š -- _(license)_ Add MIT License to the repository πŸ“„ +- *(prompt)* Enhance documentation with new prompt parts and examples ✍️ +- *(agents)* Add integration setup documentation for OpenAI and Claude πŸš€ +- *(prompts)* Enhance documentation for clarity and consistency βœ¨πŸ“š +- *(traits)* Add documentation for events and log traits πŸ“ +- *(agent-lifecycle)* Fix broken link to message tags πŸ“š +- *(license)* Add MIT License to the repository πŸ“„ ### 🎨 Styling -- _(codebase)_ Adhere to strict type declarations and coding standards -- _(output-rules)_ Refine prompt formatting for better readability -- _(provider)_ Specify return type and update doc comment in SynapseServiceProvider -- _(docblocks)_ Add comprehensive docblocks for constructors and methods -- _(codebase)_ Improve code formatting and consistency across files -- _(agent, tests)_ ⭐️ Ensure consistent code indentation 🌟 +- *(codebase)* Adhere to strict type declarations and coding standards +- *(output-rules)* Refine prompt formatting for better readability +- *(provider)* Specify return type and update doc comment in SynapseServiceProvider +- *(docblocks)* Add comprehensive docblocks for constructors and methods +- *(codebase)* Improve code formatting and consistency across files +- *(agent, tests)* ⭐️ Ensure consistent code indentation 🌟 ### πŸ§ͺ Testing -- _(agent)_ Add SearchAndScrapeAgentTest and cleanup existing tests -- _(ImageAgent)_ Add basic test structure for scraping functionality -- _(SerperTool)_ Enhance coverage and restructure tests with mocking -- _(OpenAiIntegration)_ Add test for Connects With OutputSchema -- _(memory)_ Update and reorganize CollectionMemory test fixtures -- _(ImageAgent)_ Add new fixture for image agent test πŸ€– -- _(memory)_ Add new CollectionMemory test and fixture πŸš€ +- *(agent)* Add SearchAndScrapeAgentTest and cleanup existing tests +- *(ImageAgent)* Add basic test structure for scraping functionality +- *(SerperTool)* Enhance coverage and restructure tests with mocking +- *(OpenAiIntegration)* Add test for Connects With OutputSchema +- *(memory)* Update and reorganize CollectionMemory test fixtures +- *(ImageAgent)* Add new fixture for image agent test πŸ€– +- *(memory)* Add new CollectionMemory test and fixture πŸš€ ### βš™οΈ Miscellaneous Tasks -- _(dependencies)_ Remove unused dependencies 'saloonphp/saloon' and 'spatie/laravel-data' -- _(tests)_ Restructure OpenAiIntegrationTest.php directory -- _(config)_ Add .editorconfig for consistent code formatting -- _(secrets)_ Update encrypted environment variables -- _(docs)_ Add GitHub Actions workflow to deploy VitePress site to Pages πŸš€ -- _(ci)_ Cleanup workflow and add funding configuration 🧹 -- _(workflows)_ Add GitHub Actions workflow for running tests πŸš€ -- _(workflow)_ Add GitHub Action to automate changelog updates upon release πŸš€ -- _(workflows)_ Update CI config to use PHP 8.2 and streamline testing process πŸ›  -- _(workflow)_ Add environment API keys for workflows πŸ› οΈ +- *(dependencies)* Remove unused dependencies 'saloonphp/saloon' and 'spatie/laravel-data' +- *(tests)* Restructure OpenAiIntegrationTest.php directory +- *(config)* Add .editorconfig for consistent code formatting +- *(secrets)* Update encrypted environment variables +- *(docs)* Add GitHub Actions workflow to deploy VitePress site to Pages πŸš€ +- *(ci)* Cleanup workflow and add funding configuration 🧹 +- *(workflows)* Add GitHub Actions workflow for running tests πŸš€ +- *(workflow)* Add GitHub Action to automate changelog updates upon release πŸš€ +- *(workflows)* Update CI config to use PHP 8.2 and streamline testing process πŸ›  +- *(workflow)* Add environment API keys for workflows πŸ› οΈ