TiktokenSharp 1.2.1
dotnet add package TiktokenSharp --version 1.2.1
NuGet\Install-Package TiktokenSharp -Version 1.2.1
<PackageReference Include="TiktokenSharp" Version="1.2.1" />
<PackageVersion Include="TiktokenSharp" Version="1.2.1" />
<PackageReference Include="TiktokenSharp" />
paket add TiktokenSharp --version 1.2.1
#r "nuget: TiktokenSharp, 1.2.1"
#:package TiktokenSharp@1.2.1
#addin nuget:?package=TiktokenSharp&version=1.2.1
#tool nuget:?package=TiktokenSharp&version=1.2.1
TiktokenSharp
This library is a C# implementation of the token count calculation, referencing OpenAI's official Rust language version. Currently, the encoding algorithms for o200k_base, cl100k_base, and p50k_base have been implemented. You can directly obtain the corresponding encoding algorithm using the model name.
Getting Started
TiktokenSharp is available as NuGet package.
using TiktokenSharp;
//use model name
TikToken tikToken = TikToken.EncodingForModel("gpt-3.5-turbo");
var i = tikToken.Encode("hello world"); //[15339, 1917]
var d = tikToken.Decode(i); //hello world
//use encoding name
TikToken tikToken = TikToken.GetEncoding("cl100k_base");
var i = tikToken.Encode("hello world"); //[15339, 1917]
var d = tikToken.Decode(i); //hello world
When using a new encoder for the first time, the required tiktoken files for the encoder will be downloaded from the internet. This may take some time. Once the download is successful, subsequent uses will not require downloading again. You can set TikToken.PBEFileDirectory before using the encoder to modify the storage path of the downloaded tiktoken files, or you can pre-download the files to avoid network issues causing download failures.
Why are the tiktoken files not integrated into the package? On one hand, this would make the package size larger. On the other hand, I want to stay as consistent as possible with OpenAI's official Python code.
If you are deploying cloud functions, such as "Azure App Service," which cannot read/write local files, please package tiktoken files(PBE Dir) with the publish files.
Below are the file download links: p50k_base.tiktoken cl100k_base.tiktoken o200k_base.tiktoken
Benchmark Test
- TiktokenSharp Version: 1.2.0
- SharpToken Version: 2.0.1
- Benchmark Project:
TiktokenSharp.Benchmark
Run benchmark:
dotnet run --project TiktokenSharp.Benchmark/TiktokenSharp.Benchmark.csproj --framework net10.0 -c Release
List benchmarks:
dotnet run --project TiktokenSharp.Benchmark/TiktokenSharp.Benchmark.csproj --framework net10.0 -c Release -- --list flat
<details> <summary>Code:</summary>
private GptEncoding _sharpToken = GptEncoding.GetEncoding("cl100k_base");
private TikToken _tikToken = TikToken.GetEncoding("cl100k_base");
private string _kLongText = "King Lear, one of Shakespeare's darkest and most savage plays, tells the story of the foolish and Job-like Lear, who divides his kingdom, as he does his affections, according to vanity and whim. Lear’s failure as a father engulfs himself and his world in turmoil and tragedy.";
[Benchmark]
public int SharpToken()
{
var sum = 0;
for (var i = 0; i < 10000; i++)
{
var encoded = _sharpToken.Encode(_kLongText);
var decoded = _sharpToken.Decode(encoded);
sum += decoded.Length;
}
return sum;
}
[Benchmark]
public int TiktokenSharp()
{
var sum = 0;
for (var i = 0; i < 10000; i++)
{
var encoded = _tikToken.Encode(_kLongText);
var decoded = _tikToken.Decode(encoded);
sum += decoded.Length;
}
return sum;
}
</details>
| Method | Job | Runtime | Mean | Error | StdDev | Median | Gen0 | Allocated |
|---|---|---|---|---|---|---|---|---|
| SharpToken | .NET 10.0 | .NET 10.0 | 58.24 ms | 1.159 ms | 2.885 ms | 56.97 ms | 1000.0000 | 22.13 MB |
| TiktokenSharp | .NET 10.0 | .NET 10.0 | 40.85 ms | 0.806 ms | 0.754 ms | 40.71 ms | 1076.9231 | 13.28 MB |
| SharpToken | .NET 8.0 | .NET 8.0 | 67.04 ms | 1.281 ms | 1.258 ms | 67.42 ms | 1500.0000 | 22.13 MB |
| TiktokenSharp | .NET 8.0 | .NET 8.0 | 42.97 ms | 0.851 ms | 1.107 ms | 42.63 ms | 1076.9231 | 13.28 MB |
Update
1.2.1 20260222
- Fix cache write failures in read-only environments by falling back from
PBEFileDirectory/BaseDirectoryto systemTemp. - Add in-memory loading fallback when both cache directories are unavailable to avoid runtime crashes.
- Upgrade
TiktokenSharp.Testtarget framework to.NET 10. - Move benchmark code out of
TiktokenSharp.Testinto dedicated projectTiktokenSharp.Benchmark(net8.0+net10.0). - Remove
--benchmarkmode from test runner and keepTiktokenSharp.Testfocused on functional validation.
1.2.0 20251119
- Optimize memory allocation and execution efficiency.
1.1.8 20250814
- Add Support gpt-5 models.
1.1.7 20250314
- Add Support o3 models.
1.1.6 20241224
- Optimize model name matching encoding.
1.1.5 20240913
- Add Support o1 models(o200k_base).
1.1.4 20240514
- Add Support gpt-4o(o200k_base).
1.1.0 20240408
- Optimize algorithm efficiency.
1.0.9 20240208
- Adding support for new OpenAI embeddings. by @winzig
1.0.7 20231010
- Corrected the issue where some new models could not properly obtain the encoder.
1.0.7 20231010
- Corrected the issue where some new models could not properly obtain the encoder.
1.0.6 20230625
- Replace WebClient with HttpClient, add async methods.
1.0.5 20230508
- New support for .Net Standard 2.0 has been added, making TiktokenSharp usable in the .Net Framework.
1.0.4 20230424
- Add method TikToken.GetEncoding(encodingName).
1.0.3 20230321
- GetEncodingSetting now supports the model of gpt-4 and also allows for encoding names to be directly passed in.
1.0.2 20230317
- add method TikToken.PBEFileDirectory to allow for custom storage directory of bpe files. the path needs to be set before TikToken.EncodingForModel().
1.0.1 20230313
- p50k_base encoding algorithm that supports the text-davinci-003 model.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- IndexRange (>= 1.0.2)
- System.Memory (>= 4.5.3)
-
.NETStandard 2.1
- No dependencies.
-
net10.0
- No dependencies.
-
net7.0
- No dependencies.
-
net8.0
- No dependencies.
-
net9.0
- No dependencies.
NuGet packages (5)
Showing the top 5 NuGet packages that depend on TiktokenSharp:
| Package | Downloads |
|---|---|
|
Mythosia.AI
## What's New in v6.8.0 ### Added - Reactive context-overflow recovery. When the server rejects a request for exceeding the model's context window, the conversation is compacted and the request is re-sent — no client-side token estimation, and it follows the deployment's real limit automatically. Providers now translate that rejection into ContextLengthExceededException (non-streaming) or a context_length_exceeded-flagged error chunk (streaming). Streaming recovers inside the round loop, replaying only the round that overflowed and keeping the tool results earlier rounds produced. Tunable via AIService.ContextRecoveryMaxRetries (default 1, set 0 to disable). ### Fixed - Forced compaction decided "this would not shrink the request" only after paying for a summary and irreversibly deleting messages. With the default MaxMessageCount of 20 a long agentic run hits this every time — the deletable history sits outside the window and cannot shrink anything — so recovery destroyed conversation history, spent a summary call, and still returned the original error. The check is now pure arithmetic performed before either. - The summarization request inherited the caller's AIRequestContext. RequestMessageOverride replaces the last message of every outgoing request and a summarization request is one message long, so the prompt was swapped for the caller's own message and an ordinary answer was stored as the conversation summary. - Recovery no longer retries a turn whose tools already ran. A retry restarts the provider's round loop from zero, which would execute side-effecting tools a second time. - The rewind baseline is captured per attempt instead of per turn. Once compaction shortened the history the old baseline could never be reached again, so failed attempts past the first left duplicate user messages behind (reachable with ContextRecoveryMaxRetries of 2 or more). - A stream that gave up on recovery ended without its terminating Completion chunk or accumulated usage, making the termination contract depend on whether recovery was enabled. - Anthropic's combined form — "input length and `max_tokens` exceed context limit: X + Y > Z" — is now detected. Since max_tokens rides on every request, this is the wording that actually appears, and it previously went unrecognised so recovery never engaged on Anthropic. - MessageChain.SendAsync() and RetryLastMessageAsync() bound to the raw provider overload and bypassed recovery entirely. - Gemini's legacy streaming path was the last HTTP failure site still throwing an untranslated AIServiceException. - RecoverySkipReason now distinguishes recovery-disabled, retries-exhausted, stateless and summarizing, which previously all reported null. Compaction failures preserve the provider's original stack trace. ### Known limitations - DeepSeek and Perplexity do not recover **while streaming**. Both replace the streaming pipeline wholesale (neither supports function calling, so neither needs a round loop) and recovery lives in that loop; an overflow surfaces as a flagged error chunk instead. Their non-streaming path recovers normally. - Non-streaming recovery restarts the provider's round loop, so it stops rather than replaying completed tool rounds. Streaming replays per round and has no such restriction. - A summarization request still consults `SystemMessageProvider`, so a service configured with one contributes its system message to the summary prompt as well. ### Deprecated - AIService.MaxMessageCount and ChatBlock.RemoveFunctionMessages() are [Obsolete] and will be removed in v7.0 — context management becomes token-based only (ConversationPolicy). Requires Mythosia.AI.Abstractions v2.5.0. --- ## Documentation - Basic Usage: https://github.com/AJ-comp/Mythosia.AI/wiki - Advanced Features: https://github.com/AJ-comp/Mythosia.AI/wiki/Advanced-Features - Release Notes: https://github.com/AJ-comp/Mythosia.AI/wiki/Release-Notes - GitHub: https://github.com/AJ-comp/Mythosia.AI |
|
|
NjxyChatAISDK
支持通过API调用OpenAI、DeepSeek、Doubao |
|
|
Mythosia.AI.Providers.Alibaba
Alibaba Cloud Qwen provider package for Mythosia.AI. Includes QwenService with expanded Qwen 3 / 3.5 model constants, platform-specific thinking request handling across DashScope, vLLM, and Ollama, token usage streaming support, and Mythosia.AI v6.4.0 compatibility. What's New in v1.2.8 - Context-overflow rejections are now translated through AIHttpErrorFactory, so a request refused for exceeding the model's context window raises ContextLengthExceededException and Mythosia.AI v6.8.0's reactive recovery engages. QwenService owns its own error path, so without this the recovery released in v6.8.0 could not reach Qwen or a vLLM deployment served through it. - Requires Mythosia.AI v6.8.0. What's New in v1.2.7 - Fixed: a configured "thinking off" was silently dropped unless the model id literally contained "qwen3", so a Qwen model served under an alias kept reasoning enabled. - Fixed: on vLLM, enable_thinking is now always sent as chat_template_kwargs.enable_thinking instead of a top-level parameter that the server ignored. - Thinking parameters now follow the configured ThinkingMode for every model; the provider no longer infers capability from the model name. Documentation - GitHub: https://github.com/AJ-comp/Mythosia.AI - Release Notes: core/Mythosia.AI.Providers.Alibaba/RELEASE_NOTES.md |
|
|
TokenFlow.Tokenizers
Model-specific tokenizer implementations for TokenFlow.AI (OpenAI, Claude, etc.). |
|
|
Serina.Semantic.Ai.Pipelines
Serina Pipelines for Semantic Kernel allows to build flexible Ai Proccessing pipelines. |
GitHub repositories (3)
Showing the top 3 popular GitHub repositories that depend on TiktokenSharp:
| Repository | Stars |
|---|---|
|
StartupHakk/OpenMonoAgent.ai
(BETA) AI shouldn't have a meter. Unlimited tokens. Forever. Your machine. Your agent. Use it from anywhere. Terminal-native coding agent powered by local LLMs — 100% open source, free forever, and installed with a single command. Proudly built on C#/.NET, because AI tooling should be infrastructure, not a subscription.
|
|
|
MayDay-wpf/AIBotPublic
AIBot PRO 是一个基于.NET 8 的 AI聚合客户端 to C 弱 to B 可以集成众多AI产品(ChatGPT,Gemini,Claude,文心一言,通义千问,讯飞星火),无感切换对话,支持知识库、插件开发、AI流程引擎(workflow)、以及开放平台对外输出定制化的特色AI API
|
|
|
dmitry-brazhenko/SharpToken
SharpToken is a C# library for tokenizing natural language text. It's based on the tiktoken Python library and designed to be fast and accurate.
|
| Version | Downloads | Last Updated | |
|---|---|---|---|
| 1.2.1 | 37,839 | 2/22/2026 | |
| 1.2.0 | 48,114 | 11/19/2025 | |
| 1.1.8 | 87,411 | 8/14/2025 | |
| 1.1.7 | 89,661 | 3/14/2025 | |
| 1.1.6 | 27,484 | 12/24/2024 | |
| 1.1.5 | 47,899 | 10/8/2024 | |
| 1.1.4 | 143,678 | 5/14/2024 | |
| 1.1.2 | 645 | 5/14/2024 | |
| 1.1.1 | 304 | 5/14/2024 | |
| 1.1.0 | 15,751 | 4/8/2024 | |
| 1.0.9 | 25,130 | 2/8/2024 | |
| 1.0.8 | 19,802 | 12/27/2023 | |
| 1.0.7 | 40,161 | 10/10/2023 | |
| 1.0.6 | 105,946 | 6/25/2023 | |
| 1.0.5 | 53,812 | 5/8/2023 | |
| 1.0.4 | 3,287 | 4/24/2023 | |
| 1.0.3 | 3,457 | 3/21/2023 | |
| 1.0.2 | 1,389 | 3/17/2023 | |
| 1.0.1 | 1,654 | 3/13/2023 | |
| 1.0.0 | 1,114 | 3/7/2023 |