Skip to content
Merged
Show file tree
Hide file tree
Changes from 27 commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
7604609
Add method to update workspace settings
Strift Aug 6, 2025
4897fbf
add CRUD methods
Strift Aug 13, 2025
51f4400
Refactor
Strift Aug 13, 2025
cd2b8df
Add chat completion streaming
Strift Aug 13, 2025
e52759c
Lint
Strift Aug 13, 2025
1395b8d
Run phpstan
Strift Aug 13, 2025
f87bde4
Fix doc types
Strift Aug 13, 2025
b063d4b
Add get/update methods for chat settings
Strift Aug 15, 2025
b09585f
Fix incorrect exception catch block
Strift Aug 15, 2025
0cc3972
lint
Strift Aug 15, 2025
2b98215
Update src/Http/Client.php
Strift Aug 22, 2025
bde19cc
Update src/Http/Client.php
Strift Aug 22, 2025
c2ee6ca
Merge branch 'main' into feat/add-chat-api
Strift Aug 22, 2025
cb6c0bb
Improve chat workspaces type hints
Strift Aug 22, 2025
b6ae3bb
Make workspaceName non-empty-string
Strift Aug 22, 2025
c91b873
Throw exception if token is not available
Strift Aug 22, 2025
dd6aef9
Update types and tests
Strift Aug 22, 2025
340b57f
Merge branch 'main' into feat/add-chat-api
Strift Aug 26, 2025
eafe1f2
Merge branch 'main' into feat/add-chat-api
Strift Aug 27, 2025
d78323d
Update src/Contracts/ChatWorkspacesResults.php
Strift Sep 2, 2025
4dce531
Update src/Contracts/ChatWorkspacesResults.php
Strift Sep 2, 2025
72e933e
Require prompts settings search params to be non-empty
Strift Sep 3, 2025
586c3c6
Add type hints to chat workspace settings
Strift Sep 3, 2025
fb27035
Added typehints to chat workspaces results
Strift Sep 3, 2025
56c6996
Add import and use only class name
Strift Sep 3, 2025
84b8ee0
Lint
Strift Sep 3, 2025
f67b66b
Import streaminterface and use class name
Strift Sep 3, 2025
4990e74
Make class attributes private
Strift Sep 3, 2025
2b0b414
Make chats property private
Strift Sep 3, 2025
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
79 changes: 79 additions & 0 deletions src/Contracts/ChatWorkspacePromptsSettings.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
<?php

declare(strict_types=1);

namespace Meilisearch\Contracts;

/**
* @phpstan-type ChatWorkspacePromptsArray array{
* system: string,
* searchDescription: string,
* searchQParam: non-empty-string,
* searchIndexUidParam: non-empty-string
* }
*/
class ChatWorkspacePromptsSettings extends Data
{
public string $system;
public string $searchDescription;
/**
* @var non-empty-string
*/
public string $searchQParam;
/**
* @var non-empty-string
*/
public string $searchIndexUidParam;
Copy link
Collaborator

Choose a reason for hiding this comment

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

these should be private, no?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

yes, indeed. done!


/**
* @param ChatWorkspacePromptsArray $params
*/
public function __construct(array $params)
{
parent::__construct($params);

$this->system = $params['system'];
$this->searchDescription = $params['searchDescription'];
$this->searchQParam = $params['searchQParam'];
$this->searchIndexUidParam = $params['searchIndexUidParam'];
}

public function getSystem(): string
{
return $this->system;
}

public function getSearchDescription(): string
{
return $this->searchDescription;
}

/**
* @return non-empty-string
*/
public function getSearchQParam(): string
{
return $this->searchQParam;
}

/**
* @return non-empty-string
*/
public function getSearchIndexUidParam(): string
{
return $this->searchIndexUidParam;
}

/**
* @return ChatWorkspacePromptsArray
*/
public function toArray(): array
{
return [
'system' => $this->system,
'searchDescription' => $this->searchDescription,
'searchQParam' => $this->searchQParam,
'searchIndexUidParam' => $this->searchIndexUidParam,
];
}
}
161 changes: 161 additions & 0 deletions src/Contracts/ChatWorkspaceSettings.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
<?php

declare(strict_types=1);

namespace Meilisearch\Contracts;

/**
* @phpstan-type ChatWorkspaceSource 'openAi'|'azureOpenAi'|'mistral'|'gemini'|'vLlm'
*/
class ChatWorkspaceSettings extends Data
{
/**
* @var ChatWorkspaceSource
*/
private string $source;
/**
* @var non-empty-string|null
*/
private ?string $orgId;
/**
* @var non-empty-string|null
*/
private ?string $projectId;
/**
* @var non-empty-string|null
*/
private ?string $apiVersion;
/**
* @var non-empty-string|null
*/
private ?string $deploymentId;
/**
* @var non-empty-string|null
*/
private ?string $baseUrl;
private ?string $apiKey;
private ChatWorkspacePromptsSettings $prompts;

/**
* @param array{
* source: ChatWorkspaceSource,
* orgId?: non-empty-string,
* projectId?: non-empty-string,
* apiVersion?: non-empty-string,
* deploymentId?: non-empty-string,
* baseUrl?: non-empty-string,
* apiKey?: string,
* prompts: array{
* system: string,
* searchDescription: string,
* searchQParam: non-empty-string,
* searchIndexUidParam: non-empty-string
* }
* } $params
*/
public function __construct(array $params)
{
parent::__construct($params);

$this->source = $params['source'];
$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 = new ChatWorkspacePromptsSettings($params['prompts']);
}

/**
* @return ChatWorkspaceSource
*/
public function getSource(): string
{
return $this->source;
}

/**
* @return non-empty-string|null
*/
public function getOrgId(): ?string
{
return $this->orgId;
}

/**
* @return non-empty-string|null
*/
public function getProjectId(): ?string
{
return $this->projectId;
}

/**
* @return non-empty-string|null
*/
public function getApiVersion(): ?string
{
return $this->apiVersion;
}

/**
* @return non-empty-string|null
*/
public function getDeploymentId(): ?string
{
return $this->deploymentId;
}

/**
* @return non-empty-string|null
*/
public function getBaseUrl(): ?string
{
return $this->baseUrl;
}

/**
* @return non-empty-string|null
*/
public function getApiKey(): ?string
{
return $this->apiKey;
}

public function getPrompts(): ChatWorkspacePromptsSettings
{
return $this->prompts;
}

/**
* @return array{
* source: ChatWorkspaceSource,
* orgId?: non-empty-string,
* projectId?: non-empty-string,
* apiVersion?: non-empty-string,
* deploymentId?: non-empty-string,
* baseUrl?: non-empty-string,
* apiKey?: string,
* prompts: array{
* system: string,
* searchDescription: string,
* searchQParam: non-empty-string,
* searchIndexUidParam: non-empty-string
* }
* }
*/
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->toArray(),
];
}
}
90 changes: 90 additions & 0 deletions src/Contracts/ChatWorkspacesResults.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
<?php

declare(strict_types=1);

namespace Meilisearch\Contracts;

class ChatWorkspacesResults extends Data
{
/**
* @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'];
}

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

/**
* @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;
}

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

/**
* @return non-negative-int
*/
public function count(): int
{
return \count($this->data);
}
}
7 changes: 7 additions & 0 deletions src/Contracts/Http.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use Meilisearch\Exceptions\ApiException;
use Meilisearch\Exceptions\JsonDecodingException;
use Meilisearch\Exceptions\JsonEncodingException;
use Psr\Http\Message\StreamInterface;

interface Http
{
Expand Down Expand Up @@ -46,4 +47,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 = []): StreamInterface;
}
Loading
Loading