Skip to content
Open
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/Client.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
namespace Meilisearch;

use Meilisearch\Endpoints\Batches;
use Meilisearch\Endpoints\ChatWorkspaces;
use Meilisearch\Endpoints\Delegates\HandlesBatches;
use Meilisearch\Endpoints\Delegates\HandlesChatWorkspaces;
use Meilisearch\Endpoints\Delegates\HandlesDumps;
use Meilisearch\Endpoints\Delegates\HandlesIndex;
use Meilisearch\Endpoints\Delegates\HandlesKeys;
Expand All @@ -31,6 +33,7 @@

class Client
{
use HandlesChatWorkspaces;
use HandlesDumps;
use HandlesIndex;
use HandlesTasks;
Expand All @@ -53,6 +56,7 @@ public function __construct(
?StreamFactoryInterface $streamFactory = null
) {
$this->http = new MeilisearchClientAdapter($url, $apiKey, $httpClient, $requestFactory, $clientAgents, $streamFactory);
$this->chats = new ChatWorkspaces($this->http);
$this->index = new Indexes($this->http);
$this->health = new Health($this->http);
$this->version = new Version($this->http);
Expand Down
88 changes: 88 additions & 0 deletions src/Contracts/ChatWorkspaceSettings.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
<?php

declare(strict_types=1);

namespace Meilisearch\Contracts;

class ChatWorkspaceSettings extends Data
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this misses many typehints

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

updated 🙌

{
private ?string $source;
private ?string $orgId;
private ?string $projectId;
private ?string $apiVersion;
private ?string $deploymentId;
private ?string $baseUrl;
private ?string $apiKey;
private array $prompts;

public function __construct(array $params)
{
parent::__construct($params);

$this->source = $params['source'] ?? null;
$this->orgId = $params['orgId'] ?? null;
$this->projectId = $params['projectId'] ?? null;
$this->apiVersion = $params['apiVersion'] ?? null;
$this->deploymentId = $params['deploymentId'] ?? null;
$this->baseUrl = $params['baseUrl'] ?? null;
$this->apiKey = $params['apiKey'] ?? null;
$this->prompts = $params['prompts'] ?? [];
}

public function getSource(): ?string
{
return $this->source;
}

public function getOrgId(): ?string
{
return $this->orgId;
}

public function getProjectId(): ?string
{
return $this->projectId;
}

public function getApiVersion(): ?string
{
return $this->apiVersion;
}

public function getDeploymentId(): ?string
{
return $this->deploymentId;
}

public function getBaseUrl(): ?string
{
return $this->baseUrl;
}

public function getApiKey(): ?string
{
return $this->apiKey;
}

/**
* @return array{system?: string, searchDescription?: string, searchQParam?: string, searchIndexUidParam?: string}
*/
public function getPrompts(): array
{
return $this->prompts;
}

public function toArray(): array
{
return [
'source' => $this->source,
'orgId' => $this->orgId,
'projectId' => $this->projectId,
'apiVersion' => $this->apiVersion,
'deploymentId' => $this->deploymentId,
'baseUrl' => $this->baseUrl,
'apiKey' => $this->apiKey,
'prompts' => $this->prompts,
];
}
}
59 changes: 59 additions & 0 deletions src/Contracts/ChatWorkspacesResults.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?php

declare(strict_types=1);

namespace Meilisearch\Contracts;

class ChatWorkspacesResults extends Data
{
private int $offset;
private int $limit;
private int $total;
Comment on lines +9 to +11
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
private int $offset;
private int $limit;
private int $total;
/**
* @var non-negative-int
*/
private int $offset;
/**
* @var non-negative-int
*/
private int $limit;
/**
* @var non-negative-int
*/
private int $total;


public function __construct(array $params)
{
parent::__construct($params['results'] ?? []);

$this->offset = $params['offset'];
$this->limit = $params['limit'];
$this->total = $params['total'] ?? 0;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can api really return data without total?

}

/**
* @return array<int, array{uid: string}>
*/
public function getResults(): array
{
return $this->data;
}

public function getOffset(): int
{
return $this->offset;
}

public function getLimit(): int
{
return $this->limit;
}

public function getTotal(): int
{
return $this->total;
}
Comment on lines +30 to +43
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public function getOffset(): int
{
return $this->offset;
}
public function getLimit(): int
{
return $this->limit;
}
public function getTotal(): int
{
return $this->total;
}
/**
* @return non-negative-int
*/
public function getOffset(): int
{
return $this->offset;
}
/**
* @return non-negative-int
*/
public function getLimit(): int
{
return $this->limit;
}
/**
* @return non-negative-int
*/
public function getTotal(): int
{
return $this->total;
}


public function toArray(): array
{
return [
'results' => $this->data,
'offset' => $this->offset,
'limit' => $this->limit,
'total' => $this->total,
];
}

public function count(): int
{
return \count($this->data);
}
}
6 changes: 6 additions & 0 deletions src/Contracts/Http.php
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,10 @@ public function patch(string $path, $body = null, array $query = []);
* @throws JsonDecodingException
*/
public function delete(string $path, array $query = []);

/**
* @throws ApiException
* @throws JsonEncodingException
*/
public function postStream(string $path, $body = null, array $query = []): \Psr\Http\Message\StreamInterface;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This again - misses import statement and using only class name as per coding standards

}
37 changes: 37 additions & 0 deletions src/Endpoints/ChatWorkspaces.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

declare(strict_types=1);

namespace Meilisearch\Endpoints;

use Meilisearch\Contracts\ChatWorkspacesResults;
use Meilisearch\Contracts\Endpoint;
use Meilisearch\Contracts\Http;
use Meilisearch\Endpoints\Delegates\HandlesChatWorkspaceSettings;

class ChatWorkspaces extends Endpoint
{
use HandlesChatWorkspaceSettings;

protected const PATH = '/chats';

private ?string $workspaceName;

public function __construct(Http $http, ?string $workspaceName = null)
{
$this->workspaceName = $workspaceName;
parent::__construct($http);
}

public function listWorkspaces(): ChatWorkspacesResults
{
$response = $this->http->get(self::PATH);

return new ChatWorkspacesResults($response);
}

public function workspace(string $workspaceName): self
{
return new self($this->http, $workspaceName);
}
}
81 changes: 81 additions & 0 deletions src/Endpoints/Delegates/HandlesChatWorkspaceSettings.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
<?php

declare(strict_types=1);

namespace Meilisearch\Endpoints\Delegates;

use Meilisearch\Contracts\ChatWorkspaceSettings;

trait HandlesChatWorkspaceSettings
{
/**
* Get the current settings for this chat workspace.
*/
public function getSettings(): ChatWorkspaceSettings
{
if (null === $this->workspaceName) {
throw new \InvalidArgumentException('Workspace name is required to get settings');
}

$response = $this->http->get('/chats/'.$this->workspaceName.'/settings');

return new ChatWorkspaceSettings($response);
}

/**
* Update the settings for this chat workspace.
*
* @param array{
* source?: 'openAi'|'azureOpenAi'|'mistral'|'gemini'|'vLlm',
* orgId?: string,
* projectId?: string,
* apiVersion?: string,
* deploymentId?: string,
* baseUrl?: string,
* apiKey?: string,
* prompts?: array<string, string>
* } $settings
*/
public function updateSettings(array $settings): ChatWorkspaceSettings
{
if (null === $this->workspaceName) {
throw new \InvalidArgumentException('Workspace name is required to update settings');
}

$response = $this->http->patch('/chats/'.$this->workspaceName.'/settings', $settings);

return new ChatWorkspaceSettings($response);
}

/**
* Reset the settings for this chat workspace to default values.
*/
public function resetSettings(): ChatWorkspaceSettings
{
if (null === $this->workspaceName) {
throw new \InvalidArgumentException('Workspace name is required to reset settings');
}

$response = $this->http->delete('/chats/'.$this->workspaceName.'/settings');

return new ChatWorkspaceSettings($response);
}

/**
* Create a streaming chat completion using OpenAI-compatible API.
*
* @param array{
* model: string,
* messages: array<array{role: string, content: string}>,
* stream: bool
* } $options The request body for the chat completion
*/
public function streamCompletion(array $options): \Psr\Http\Message\StreamInterface
{
if (null === $this->workspaceName) {
throw new \InvalidArgumentException('Workspace name is required for chat completion');
}

return $this->http->postStream('/chats/'.$this->workspaceName.'/chat/completions', $options);
}
}
29 changes: 29 additions & 0 deletions src/Endpoints/Delegates/HandlesChatWorkspaces.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

declare(strict_types=1);

namespace Meilisearch\Endpoints\Delegates;

use Meilisearch\Contracts\ChatWorkspacesResults;
use Meilisearch\Endpoints\ChatWorkspaces;

trait HandlesChatWorkspaces
{
public ChatWorkspaces $chats;

/**
* List all chat workspaces.
*/
public function getChatWorkspaces(): ChatWorkspacesResults
{
return $this->chats->listWorkspaces();
}

/**
* Get a specific chat workspace instance.
*/
public function chatWorkspace(string $workspaceName): ChatWorkspaces
{
return $this->chats->workspace($workspaceName);
}
}
Loading
Loading