PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 3.1.3
AI Engine – The Chatbot, AI Framework & MCP for WordPress v3.1.3
3.6.1 3.6.0 3.5.9 3.5.8 3.5.7 3.5.6 3.5.5 3.5.4 3.5.3 3.5.2 3.5.1 3.5.0 3.4.9 3.4.8 3.4.7 0.2.1 1.6.91 0.2.2 1.6.92 0.2.3 1.6.93 0.2.4 1.6.94 0.2.5 1.6.95 0.2.6 1.6.96 0.2.7 1.6.97 0.2.8 1.6.98 0.2.9 1.6.99 0.3.0 1.7.0 0.3.1 1.7.1 0.3.2 1.7.2 0.3.3 1.7.3 0.3.4 1.7.4 0.3.5 1.7.5 0.3.6 1.7.6 0.4.0 1.7.7 0.4.1 1.7.8 0.4.2 1.7.9 0.4.3 1.8.0 0.4.4 1.8.1 0.4.5 1.8.2 0.4.6 1.8.3 0.4.7 1.8.4 0.4.8 1.8.5 0.4.9 1.8.6 0.5.0 1.8.7 0.5.1 1.8.8 0.5.2 1.8.9 0.5.3 1.9.0 0.5.4 1.9.1 0.5.5 1.9.2 0.5.6 1.9.3 0.5.7 1.9.4 0.5.8 1.9.5 0.5.9 1.9.6 0.6.0 1.9.7 0.6.1 1.9.8 0.6.2 1.9.81 0.6.3 1.9.82 0.6.4 1.9.83 0.6.5 1.9.84 0.6.6 1.9.85 0.6.7 1.9.86 0.6.8 1.9.87 0.6.9 1.9.88 0.7.0 1.9.89 0.7.1 1.9.90 0.7.2 1.9.91 0.7.3 1.9.92 0.7.4 1.9.93 0.7.5 1.9.94 0.7.6 1.9.95 0.7.7 1.9.96 0.7.8 1.9.97 0.7.9 1.9.98 0.8.0 1.9.99 0.8.1 2.0.0 0.8.2 2.0.1 0.8.3 2.0.2 0.8.4 2.0.3 0.8.5 2.0.4 0.8.6 2.0.5 0.8.7 2.0.6 0.8.8 2.0.7 0.8.9 2.0.8 0.9.0 2.0.9 0.9.2 2.1.0 0.9.3 2.1.1 0.9.4 2.1.2 0.9.5 2.1.3 0.9.6 2.1.4 0.9.7 2.1.5 0.9.8 2.1.6 0.9.81 2.1.7 0.9.82 2.1.8 0.9.83 2.1.9 0.9.84 2.2.0 0.9.85 2.2.1 0.9.86 2.2.2 0.9.87 2.2.3 0.9.88 2.2.4 0.9.89 2.2.5 0.9.9 2.2.51 0.9.91 2.2.52 0.9.92 2.2.53 0.9.93 2.2.54 0.9.94 2.2.56 0.9.95 2.2.57 0.9.96 2.2.6 0.9.97 2.2.60 0.9.98 2.2.61 0.9.99 2.2.62 1.0.0 2.2.63 1.0.01 2.2.70 1.0.1 2.2.80 1.0.2 2.2.81 1.0.3 2.2.90 1.0.4 2.2.91 1.0.5 2.2.92 1.0.6 2.2.93 1.0.7 2.2.94 1.0.8 2.2.95 1.0.9 2.3.0 1.1.0 2.3.1 1.1.1 2.3.2 1.1.2 2.3.3 1.1.3 2.3.4 1.1.4 2.3.5 1.1.5 2.3.6 1.1.6 2.3.7 1.1.7 2.3.8 1.1.8 2.3.9 1.1.9 2.4.0 1.2.0 2.4.1 1.2.1 2.4.2 1.2.2 2.4.3 1.2.21 2.4.4 1.2.3 2.4.5 1.2.30 2.4.6 1.3.0 2.4.7 1.3.1 2.4.8 1.3.2 2.4.9 1.3.3 2.5.0 1.3.31 2.5.1 1.3.32 2.5.2 1.3.33 2.5.3 1.3.34 2.5.4 1.3.35 2.5.5 1.3.36 2.5.6 1.3.37 2.5.7 1.3.38 2.5.8 1.3.39 2.5.9 1.3.40 2.6.0 1.3.41 2.6.1 1.3.42 2.6.2 1.3.43 2.6.3 1.3.44 2.6.5 1.3.45 2.6.6 1.3.46 2.6.7 1.3.47 2.6.8 1.3.48 2.6.9 1.3.49 2.7.0 1.3.50 2.7.1 1.3.51 2.7.2 1.3.52 2.7.3 1.3.53 2.7.4 1.3.54 2.7.5 1.3.56 2.7.6 1.3.57 2.7.7 1.3.58 2.7.8 1.3.59 2.7.9 1.3.60 2.8.0 1.3.61 2.8.1 1.3.62 2.8.2 1.3.63 2.8.3 1.3.64 2.8.4 1.3.65 2.8.5 1.3.66 2.8.6 1.3.67 2.8.7 1.3.68 2.8.8 1.3.69 2.8.9 1.3.70 2.9.0 1.3.71 2.9.1 1.3.72 2.9.2 1.3.73 2.9.3 1.3.74 2.9.4 1.3.75 2.9.5 1.3.76 2.9.6 1.3.77 2.9.7 1.3.78 2.9.8 1.3.79 2.9.9 1.3.80 3.0.0 1.3.81 3.0.1 1.3.82 3.0.2 1.3.83 3.0.3 1.3.84 3.0.4 1.3.85 3.0.5 1.3.86 3.0.6 1.3.87 3.0.7 1.3.88 3.0.8 1.3.89 3.0.9 1.3.90 3.1.0 1.3.91 3.1.1 1.3.92 3.1.2 1.3.93 3.1.3 1.3.94 3.1.4 1.3.95 3.1.5 1.3.96 3.1.6 1.3.97 3.1.7 1.3.98 3.1.8 1.3.99 3.1.9 1.4.0 3.2.0 1.4.1 3.2.1 1.4.2 3.2.2 1.4.3 3.2.3 1.4.4 3.2.4 1.4.5 3.2.5 1.4.6 3.2.6 1.4.7 3.2.7 1.4.8 3.2.8 1.4.9 3.2.9 1.5.0 3.3.0 1.5.1 3.3.1 1.5.2 3.3.2 1.5.3 3.3.3 1.5.4 3.3.4 1.5.5 3.3.5 1.5.6 3.3.6 1.5.7 3.3.7 1.5.8 3.3.8 1.5.9 3.3.9 1.6.0 3.4.0 1.6.1 3.4.1 1.6.2 3.4.2 1.6.3 3.4.3 1.6.5 3.4.4 1.6.51 3.4.5 1.6.52 3.4.6 1.6.53 1.6.54 1.6.55 1.6.56 1.6.57 1.6.58 1.6.59 1.6.60 1.6.61 1.6.62 1.6.63 1.6.64 1.6.65 1.6.66 1.6.67 1.6.68 trunk 1.6.69 0.0.1 1.6.70 0.0.2 1.6.71 0.0.3 1.6.72 0.0.4 1.6.73 0.0.5 1.6.74 0.0.6 1.6.75 0.0.7 1.6.76 0.0.8 1.6.77 0.0.9 1.6.78 0.1.0 1.6.79 0.1.1 1.6.81 0.1.2 1.6.82 0.1.3 1.6.83 0.1.4 1.6.84 0.1.5 1.6.85 0.1.6 1.6.86 0.1.7 1.6.87 0.1.8 1.6.88 0.1.9 1.6.89 0.2.0 1.6.90
ai-engine / vendor / yethee / tiktoken / src / Encoder.php
ai-engine / vendor / yethee / tiktoken / src Last commit date
Exception 10 months ago Util 10 months ago Vocab 10 months ago Encoder.php 10 months ago EncoderProvider.php 10 months ago
Encoder.php
201 lines
1 <?php
2
3 declare(strict_types=1);
4
5 namespace Yethee\Tiktoken;
6
7 use Stringable;
8 use Yethee\Tiktoken\Exception\RegexError;
9 use Yethee\Tiktoken\Util\EncodeUtil;
10 use Yethee\Tiktoken\Vocab\Vocab;
11
12 use function array_map;
13 use function array_merge;
14 use function array_values;
15 use function count;
16 use function implode;
17 use function preg_last_error_msg;
18 use function preg_match_all;
19 use function sprintf;
20 use function strlen;
21 use function substr;
22
23 use const PHP_INT_MAX;
24
25 /** @psalm-import-type NonEmptyByteVector from EncodeUtil */
26 final class Encoder implements Stringable
27 {
28 /**
29 * @param non-empty-string $name
30 * @param non-empty-string $pattern
31 */
32 public function __construct(public readonly string $name, private Vocab $vocab, private string $pattern)
33 {
34 }
35
36 public function __toString(): string
37 {
38 return sprintf('Encoder(name="%s", vocab=%d)', $this->name, count($this->vocab));
39 }
40
41 /** @return list<int> */
42 public function encode(string $text): array
43 {
44 if ($text === '') {
45 return [];
46 }
47
48 if (preg_match_all($this->pattern, $text, $matches) === false) {
49 throw new RegexError(sprintf('Matching failed with error: %s', preg_last_error_msg()));
50 }
51
52 $tokens = [];
53
54 foreach ($matches[0] as $match) {
55 if ($match === '') {
56 continue;
57 }
58
59 $rank = $this->vocab->tryGetRank($match);
60
61 if ($rank !== null) {
62 $tokens[] = $rank;
63
64 continue;
65 }
66
67 foreach ($this->mergeBytePairs($match) as $rank) {
68 $tokens[] = $rank;
69 }
70 }
71
72 return $tokens;
73 }
74
75 /**
76 * Encodes a given text into chunks of Byte-Pair Encoded (BPE) tokens, with each chunk containing a specified
77 * maximum number of tokens.
78 *
79 * @param string $text The input text to be encoded.
80 * @param positive-int $maxTokensPerChunk The maximum number of tokens allowed per chunk.
81 *
82 * @return list<list<int>> An array of arrays containing BPE token chunks.
83 */
84 public function encodeInChunks(string $text, int $maxTokensPerChunk): array
85 {
86 if ($text === '') {
87 return [];
88 }
89
90 if (preg_match_all($this->pattern, $text, $matches) === false) {
91 throw new RegexError(sprintf('Matching failed with error: %s', preg_last_error_msg()));
92 }
93
94 $chunks = [];
95 $tokensInCurrentChunk = [];
96
97 foreach ($matches[0] as $match) {
98 if ($match === '') {
99 continue;
100 }
101
102 $rank = $this->vocab->tryGetRank($match);
103 $tokens = $rank !== null ? [$rank] : $this->mergeBytePairs($match);
104
105 if (count($tokensInCurrentChunk) + count($tokens) > $maxTokensPerChunk) {
106 $chunks[] = $tokensInCurrentChunk;
107 $tokensInCurrentChunk = [];
108 }
109
110 $tokensInCurrentChunk = array_merge($tokensInCurrentChunk, $tokens);
111 }
112
113 if (count($tokensInCurrentChunk) > 0) {
114 $chunks[] = $tokensInCurrentChunk;
115 }
116
117 return $chunks;
118 }
119
120 /** @param array<int> $tokens */
121 public function decode(array $tokens): string
122 {
123 if ($tokens === []) {
124 return '';
125 }
126
127 return implode(array_map($this->vocab->getToken(...), $tokens));
128 }
129
130 /**
131 * @param non-empty-string $piece
132 *
133 * @return list<int>
134 */
135 private function mergeBytePairs(string $piece): array
136 {
137 $parts = [];
138
139 for ($i = 0; $i <= strlen($piece); $i++) {
140 $parts[] = [$i, PHP_INT_MAX];
141 }
142
143 $getRank = function (array $parts, int $startIndex, int $skip = 0) use (&$piece): int {
144 if (($startIndex + $skip + 2) >= count($parts)) {
145 return PHP_INT_MAX;
146 }
147
148 $offset = $parts[$startIndex][0];
149 $length = $parts[$startIndex + $skip + 2][0] - $offset;
150
151 return $this->vocab->tryGetRank(substr($piece, $offset, $length)) ?? PHP_INT_MAX;
152 };
153
154 for ($i = 0; $i < count($parts) - 2; $i++) {
155 $parts[$i][1] = $getRank($parts, $i);
156 }
157
158 while (count($parts) > 1) {
159 $minRank = PHP_INT_MAX;
160 $partIndex = 0;
161 $stop = count($parts) - 1;
162
163 for ($i = 0; $i < $stop; $i++) {
164 if ($minRank <= $parts[$i][1]) {
165 continue;
166 }
167
168 $minRank = $parts[$i][1];
169 $partIndex = $i;
170 }
171
172 if ($minRank === PHP_INT_MAX) {
173 break;
174 }
175
176 unset($parts[$partIndex + 1]);
177 $parts = array_values($parts);
178
179 $parts[$partIndex][1] = $getRank($parts, $partIndex);
180
181 if ($partIndex <= 0) {
182 continue;
183 }
184
185 $parts[$partIndex - 1][1] = $getRank($parts, $partIndex - 1);
186 }
187
188 $stop = count($parts) - 1;
189 $res = [];
190
191 for ($i = 0; $i < $stop; $i++) {
192 $offset = $parts[$i][0];
193 $length = $parts[$i + 1][0] - $offset;
194
195 $res[] = $this->vocab->getRank(substr($piece, $offset, $length));
196 }
197
198 return $res;
199 }
200 }
201