> This is part 1 of 2 of the full documentation (pages 1–100 of 158).
> The content is paginated: fetch every part to see all of it.
> Next part: https://docs.tabnine.com/main/llms-full.txt/1
> Page index: https://docs.tabnine.com/main/llms.txt

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
This site has an agentic ask interface you may use to query the documentation dynamically by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.tabnine.com/main/index.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

---

# Overview

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-4eb651c8d3f4fdbd70d3e8215632862590cb1be3%2FGroup%201406.png?alt=media" alt=""><figcaption></figcaption></figure>

## What is Tabnine?

Tabnine is a fully private, organization-aware AI coding agent designed to run entirely within your environment. It connects to your repositories and development systems to deliver real-time, secure code assistance and automated workflows across the software lifecycle.

Tabnine boosts engineering velocity, code quality, and developer happiness by automating the coding workflow through AI tools customized to your team.

#### How to use Tabnine <a href="#how-to-use-tabnine" id="how-to-use-tabnine"></a>

* Use Tabnine Agent, via either [**CLI**](/main/getting-started/tabnine-cli) or [**IDE**](/main/getting-started/tabnine-agent) environments, to perform your coding tasks.
* Use [**Tabnine Chat**](/main/getting-started/tabnine-chat) to ask questions about your codebase.
* Learn about the [**administrator's capabilities**](/main/administering-tabnine/managing-your-team) to understand, control, and govern your organization's usage of Tabnine.

#### Other topics

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-cover data-type="files"></th></tr></thead><tbody><tr><td><strong>General information</strong></td><td><ul><li><a href="/main/welcome/readme/security">Security</a></li><li><a href="/main/welcome/readme/ai-models">AI Models</a></li><li><a href="/main/welcome/readme/system-requirements#tabnine-cluster">System requirements</a></li><li><a href="https://www.tabnine.com/pricing">Tabnine plans</a></li></ul></td><td></td><td></td></tr><tr><td><strong>Using Tabnine</strong></td><td><ul><li><a href="/main/getting-started/install">Install</a></li><li><a href="/main/getting-started/quickstart">Quickstart</a></li><li><a href="/main/getting-started/tabnine-agent">Tabnine Agent</a></li><li><a href="/main/getting-started/tabnine-chat">Tabnine Chat</a></li></ul></td><td></td><td></td></tr><tr><td><strong>Admin Capabilities</strong></td><td><ul><li><a href="/main/administering-tabnine/managing-your-team/reporting">Analytics</a></li><li><a href="/main/administering-tabnine/managing-your-team/team-management">Team Management</a></li><li><a href="/main/administering-tabnine/managing-your-team/user-management">User Management</a></li><li><a href="/main/administering-tabnine/managing-your-team/context-engine">Context Engine</a></li><li><a href="/main/administering-tabnine/managing-your-team/context-engine/settings">Settings</a></li><li><a href="/main/administering-tabnine/managing-your-team/tabnine-apis">APIs</a></li></ul></td><td></td><td></td></tr></tbody></table>


# Architecture

Tabnine provides a secure, reliable, and resilient platform that's been designed from the ground up based on industry best practices.

Tabnine installs on a Kubernetes cluster on-premises or supported cloud providers.

## High-level architecture

The following diagram displays Tabnine's architecture:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-1136bfda98863206fe5780b2e2d7525717ed45ca%2FTabnine%20cluster%20architecture.png?alt=media" alt=""><figcaption></figcaption></figure>

**The Tabnine platform includes three main components:**

<details>

<summary>Tabnine client (IDE plugin)</summary>

End users install Tabnine as an IDE plugin on their local device.

The Tabnine IDE plugin enables Tabnine’s code completion or chat features within the developer’s IDE.

The client queries a remote Tabnine cluster requesting assistance for the relevant Context Window.

</details>

<details>

<summary>Tabnine cluster</summary>

Tabnine's Kubernetes cluster runs the following services:

* **Inference service:** Runs on a GPU-accelerated node, which serves responses based on the AI models
* **Data plane:** Includes analytics and log services; no code is stored nor sent to the data plane, and user identifiers are always masked
* **Control plane:** Includes identity and user management, an update service, and a configuration service

</details>

<details>

<summary>Tabnine’s AI models</summary>

Tabnine uses two types of proprietary AI models for code completions and chat:

* **Universal models**, trained on public, permissive, state-of-the-art, open source code
* **Fine-tuned AI models** with expanded training of Tabnine’s models with your codebase (Tabnine Enterprise only)

**Pro** users only have access to the universal models.

**Enterprise customers** can have fine-tuned AI models. [Explore plans](https://www.tabnine.com/pricing)

In addition: Tabnine Chat users in Tabnine **Pro** and can switch to **third-party models** not hosted by Tabnine, by accepting their terms of use. Note, the third-party models may offer different code privacy and protection policies. In Tabnine Enterprise, the team admin controls which chat models are available to the organization. For private installation deployment, only the Tabnine Protected model is currently available. [Learn more](/main/welcome/readme/ai-models)

</details>

### Deployment types

Tabnine has two deployment types:

**Tabnine SaaS:** The Tabnine server is hosted in the Tabnine Secure Cloud. This is the default Tabnine option for users with all Tabnine plans (Pro & Enterprise).

[**Tabnine private installation**](/main/welcome/readme/architecture/deployment-options#private-installations-self-hosted-deployments)**:** The Tabnine server is hosted privately by the customer, either on the customer's VPC (AWS, GCP, or Azure) or on-premises. This is an option that's offered to some Tabnine Enterprise customers.


# Deployment Options

Tabnine AI code assistant deployment options

### Deployment options

* **Private installation** (self-hosted deployments):

  * Virtual private cloud (VPC)
  * On-premises

  \* Private installations can be deployed in a completely air-gapped environment

Enterprise customers are also offered private deployment options. [Contact Sales](https://www.tabnine.com/contact-us/?utm_source=docs\&utm_medium=organic\&utm_campaign=docs)

{% hint style="info" %}
**Follow the right docs**

The client installation and management instructions are slightly different between **Tabnine SaaS** and **Tabnine private installation**.
{% endhint %}

***

### Secure SaaS

This type of deployment is available for Starter, Pro, and Enterprise customers.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-00e999c63081c005671fe040ae611b368db2d256%2FNew%20Architecture%20red%20brand%202.png?alt=media" alt=""><figcaption></figcaption></figure>

The solution is hosted, managed, and monitored by Tabnine, and is frequently updated.

Tabnine is committed to maintaining the highest levels of security and privacy for our clients. With our SaaS deployment, we’ve implemented an end-to-end encryption system to ensure that the communication between our client’s users and our servers remains completely secure. [Read more about the security](https://trust.tabnine.com/) we provide.

**Continuous monitoring and audits:** Our security team continuously monitors for vulnerabilities and conducts regular audits to ensure that our security infrastructure is up to the latest standards. This ensures that our customers' data is handled with the utmost care and security.

Please check our [Trust Center](https://trust.tabnine.com/) for more information.

***

### Private installations (self-hosted deployments)

These are the private installation options that are offered for Tabnine Enterprise:

### VPC

This is an option for [Tabnine Enterprise](https://www.tabnine.com/enterprise) customers.

<figure><img src="https://d16xvuom8mr9m8.cloudfront.net/_next/static/images/vpc-8be1ddc4d06d3c5267e175e28171d1e8.png" alt=""><figcaption></figcaption></figure>

In a VPC setup, the Tabnine cluster is a Kubernetes-hosted unit on your virtual private cloud (**GCP**, **AWS,** or **Azure**). Tabnine doesn't have access to the customer environment. Periodic software updates are done in a controlled way.

Learn more about the [system requirements](/main/welcome/readme/system-requirements#tabnine-cluster) for the cluster.

***

### **On-premises**

This is an option for [Tabnine Enterprise](https://www.tabnine.com/enterprise) customers.

<figure><img src="https://d16xvuom8mr9m8.cloudfront.net/_next/static/images/on_perm-629b5cad01ee5a49b072229071f07a68.png" alt=""><figcaption></figcaption></figure>

In an on-premises private installation, the Tabnine cluster is a Kubernetes cluster hosted on the customer's servers on their private network. Tabnine doesn't have access to the customer environment. Periodic software updates are done in a controlled way.

Learn more about [system requirements](/main/welcome/readme/system-requirements#tabnine-cluster) for the cluster.

***

### Fully air-gapped private installation

This is an option for [Tabnine Enterprise](https://www.tabnine.com/enterprise) customers.

<figure><img src="https://d16xvuom8mr9m8.cloudfront.net/_next/static/images/cluster-f2082de03a46eb63781b73bd83d5eb0c.png" alt=""><figcaption></figcaption></figure>

The Tabnine solution can also be deployed in a completely air-gapped environment.


# Security

Tabnine AI code assistant: Security

Tabnine provides a secure, reliable, and resilient platform that's been designed from the ground up based on industry best practices.

This article reviews the network and hardware infrastructure, software, and information security that Tabnine includes as part of this platform.

{% hint style="info" %}
View our [Trust Center](https://trust.tabnine.com/) for more information.
{% endhint %}

## **Compliance**

* [SOC2 compliant](https://trust.tabnine.com/)
* [GDPR compliant](https://trust.tabnine.com/)

## Tabnine SaaS datacenters <a href="#data-centers" id="data-centers"></a>

The Tabnine SaaS platform utilizes Amazon Web Services (AWS) and Google Cloud Platform (GCP) to host our cloud-based capabilities. AWS’s main datacenter is located in North Virginia on the East Coast, GCP’s main datacenter is located in Council Bluffs, Iowa, North America, and Heroku’s main datacenter is located in Virginia, United States.

**Datacenters security and compliance**

AWS and GCP design and manage their infrastructure in alignment with the following regulations, standards, and best practices:

* [AWS Cloud Security](https://aws.amazon.com/security/)
* [Google Cloud Security](https://cloud.google.com/security)
* [AWS compliance](https://aws.amazon.com/compliance/programs/), [GCP compliance](https://cloud.google.com/security/compliance/offerings): ISO 27001, 27017, 27018, SOC1/SOC2/SOC3, PCI DSS Level 1, HIPAA, FedRAMP (and more)

**Datacenters architectural physical security**

**Access control:** Physical access is limited only to approved employees and contractors with a legitimate business purpose. Visitors are required to present identification cards and are signed in and escorted by authorized staff. Privileges for employees are revoked immediately when there is no longer a business need for them. Cardholder access to datacenters is reviewed on a quarterly basis.

**Surveillance:** Physical access is controlled both at the perimeter and at building entrance points by professional security staff utilizing video surveillance, intrusion detection systems, and other electronic means.

**Two-factor authentication:** Authorized staff must pass two-factor authentication twice to access dataenter floors.

#### **Environmental protection**

**Redundancy:** The dataenters are designed to anticipate and tolerate failure while maintaining service levels with core applications deployed to an N+1 standard.

**Fire detection and suppression:** Automatic fire detection and suppression equipment have been installed to reduce risk.

**Redundant power:** The datacenter electrical power systems are designed to be fully redundant and maintainable without impact on operations, 24 hours a day, and uninterruptible power supply (UPS) units provide backup power in the event of an electrical failure. Datacenters use generators to provide backup power for the entire facility.

**Climate and temperature controls:** Maintain a constant operating temperature and humidity level for all hardware.

## Tabnine SaaS setup

Tabnine's SaaS deployment includes an end-to-end encryption system to ensure that the communication between our client’s users and our servers remains completely secure.

* **End-to-end encryption:** As the user codes and Tabnine provides suggestions, the data sent from the user's machine to our servers is encrypted using industry-standard encryption algorithms. This ensures that the data can’t be read or tampered with during transit. Likewise, when our servers send back code suggestions to the user's machine, this data is also encrypted. This encryption process ensures that only the user's machine and our servers can decrypt and understand the data, making it secure from eavesdropping or person-in-the-middle attacks.
* **Transport Layer Security (TLS):** We use TLS — a widely adopted security protocol — for securing the communication channel between the client's machine and our servers. TLS ensures that the data is not only encrypted but also that the integrity and authenticity of the data are maintained.
* **No code storage policy (ephemeral processing):** At Tabnine, we recognize the sensitive nature of the codebase. This means that we adhere to a strict policy wherein no code is stored on our servers. The code is only ephemerally processed to provide coding suggestions and is then immediately discarded. This minimizes the risk of any unauthorized access or data breaches concerning your code.
* **Data handling compliance:** In addition to end-to-end encryption, Tabnine complies with various international standards and regulations regarding data handling and privacy. This ensures that our practices are aligned with the best industry standards.
* **Continuous monitoring and audits:** Our security team continuously monitors for vulnerabilities and conducts regular audits to ensure that our security infrastructure is up to the latest standards. This ensures that our customers' data is handled with the utmost care and security.

## Application security <a href="#application-security" id="application-security"></a>

**Software development life cycle:** Software development and change management at Tabnine are performed in a manner that helps ensure applications are properly designed, tested, approved, and aligned to Tabnine’s customers’ business objectives.

Changes are discussed, evaluated, and approved by relevant managers from Product, Development, and DevOps. Changes are documented and approved within an SDLC application. Personnel responsibilities for the design, acquisition, implementation, configuration, modification, and management of systems are assigned. In addition, changes performed to the application are communicated to Tabnine’s customers through release notes.

**Data encryption:** All traffic between the customer client and Tabnine’s Server is encrypted using HTTPS TLS 1.2. Stored data is encrypted on a disk using a 256-bit AES cipher.

**Threat and mitigation analysis:** Tabnine will typically perform a threat and mitigation analysis with security consultants for new products and major changes.

**User identity:** For cloud solutions, Tabnine uses [Google Cloud Identity](https://cloud.google.com/identity) to manage user identity, supporting customers using either strong user/password authentication **or** using provider identity including GitHub, Google, or Microsoft accounts using OAuth2 (user can only choose one of the methods, not both). In the self-hosted solution, built-in user/password authentication is available, as well as support for SAML2 SSO integration.

**Authentication:** All requests from client to server are protected by JWT with an expiration period of 1 hour.

**User permissions:** Tabnine provides two levels of user permissions. A user can be assigned to either "member" or "admin" on the Members page in Tabnine’s web admin application. Admin permission allows control over team membership, payments, and code repository integrations.

**Self-service user management:** Tabnine provides a self-service user management system. The customer’s admins have access to a user management console. There, the team admin can manage users for the account.

**Default password policy:** A user password must be at least six characters long and contain at least one letter and one digit character. Upon password loss, the user can unlock the account by going through the "forgot password" procedure, which allows them to choose a new password after being authenticated through email.

### Enterprise security

Tabnine Enterprise customers Tabnine in a private installation to comply with the strictest enterprise security and privacy policies.


# Privacy

Tabnine AI code assistant: Privacy

## Code Privacy

**When using Tabnine models, your code remains private. Tabnine NEVER retains or shares any of your code with third parties.**

Tabnine has a *no-train-no-retain* policy. This is in place regardless which model is being used.

### Querying the Tabnine AI Model for AI Coding Assistance

As you code, the Tabnine client (plugin) requests AI assistance from the Tabnine cluster.

For code suggestions, the process occurs in the background as you code. For chat, this request process occurs once the user asks a question.

These requests include **some code from the local project as context** (the **“context window”** as described below) to allow Tabnine to return the most relevant and accurate answers. This context window **may include elements from your local environment, such as**:

* Chat history (for chat)
* Lines of code
* Variables
* Type declarations
* Functions
* Objects
* Related imports from the current file
* Related files
* Syntactic and semantic error reports

This context is deleted **immediately** after the server returns the answer to the client.

**Tabnine doesn’t retain any user code beyond the immediate time frame** required for inferencing the model. This is what we call ephemeral processing.

The sole purpose of the **context window** is to facilitate the most accurate answers possible. The moment that output is generated, the code is discarded and is never stored.

This is true even for [Tabnine Enterprise’s](https://www.tabnine.com/enterprise) private deployment options (on-premises and VPC).

#### **With Tabnine models, your code is not shared with third parties**

We develop our AI models based on our own pioneering experience and the best-of-breed, permissive, open source technologies in the market.

No third-party APIs are used.

#### **Tabnine does not train its models on your code**

**Tabnine’s code completion model and Tabnine Protected chat model are only trained on open source code with permissive licenses.**

Private fine-tuned AI models are pretrained on private code by Tabnine and are only accessible by your team members and stored on your private setup.

Learn more about [Tabnine’s AI models](/main/welcome/readme/ai-models).

{% hint style="info" %}
**Clarification regarding the Magic Moments feature**

The code completion examples in the Tabnine Hub (in the IDE) under the **Magic Moments** tab are saved locally on the user's machine and never leave the computer.
{% endhint %}

### Personalization

Tabnine's personalization capabilities — including **context** through local code awareness and **connection** to software repository for global code awareness — require creating a RAG index of your code. The computation for vector embeddings for the chat [RAG index](/main/welcome/readme/personalization/tabnines-personalization-in-depth#the-rag-index) requires a lot of resources, and cannot be done locally without stressing the user’s machine. Tabnine performs this computation on the server GPU while keeping the same principles:

* Your code remains private; Tabnine never stores your code.
* Tabnine does not share any of your code with third parties.
* Tabnine does not train on your code.

[Learn more](/main/welcome/readme/personalization#personalization-and-code-privacy)

### **Data Plane in Self-Hosted / Air-Gapped Deployment**

The Tabnine cluster collects operational metrics and logs to ensure system health and quality of service.

In an air-gapped deployment, metrics can be sent to a Prometheus server and logs can be sent to your log aggregator. In a self-hosted deployment, the Tabnine cluster sends operational metrics and logs to Tabnine’s servers to allow improved support when required. **No code or PII data is ever sent to Tabnine’s servers**.

### **Tabnine Cluster**

The Tabnine cluster sends operational metrics and logs (every 1 second) to Tabnine’s servers. Metrics and logs data are retained for a week. This includes:

* GPU and CPU utilization
* GPU and CPU memory
* Server throughput
* Server latency

### **Tabnine Client**

The Tabnine client sends telemetry to Tabnine’s self-hosted server (which is then streamed to Tabnine’s servers) on various user interactions. This includes:

* Plugin and binary configurations
* User machine details, including CPU type, available processors, and memory
* One-way hashed, nonidentifiable data, including user email, hostname, and IP
* IDE details, including type and version
* Statistical data: Aggregated number of suggestions/completions per programming language


# Protection

Tabnine AI code assistant: Protection

Models might recite code they were trained on. The unwary developer might commit code recited from an open source repository with a nonpermissive license. This will expose their employer to a legal risk due to the code license infringement.

### Inference-time protection

Using any model, Tabnine can offer its clients protection from potentially license-infringing code generation, regardless of the data the model has been trained on.

{% content-ref url="/pages/zAAsfuyJt0EXzcmuQ4jK" %}
[Provenance and Attribution](/main/welcome/readme/protection/provenance-and-attribution)
{% endcontent-ref %}


# Provenance and Attribution

Minimize IP liability of third-party models

{% hint style="info" %}
Attribution and Censorship is *always* checked as the last step of code generation. Custom behaviors and custom commands cannot be used to override the censorship check.
{% endhint %}

LLMs are trained on vast amounts of data, including code that may have restrictions on how it can be used, introducing the risk of IP infringement.

With Provenance and Attribution, you can drastically reduce the risk of IP liability when using models for software development.

Tabnine checks the code generated within our AI chat against the publicly visible code on GitHub, flags any matches it finds, and references the source repository and its license type. This critical information makes it easier for you to review code suggestions and decide if they meet your specific requirements and policies.

This feature enables you to leverage the performance gains from powerful LLMs, and minimize the likelihood of copyleft-licensed code getting into your codebase.

### Attribution Service Endpoint

{% hint style="info" %}
Some self-hosted users with air-gapped deployments may install the full attribution database on-prem, so do not use endpoints described below.
{% endhint %}

Tabnine’s Provenance and Attribution feature relies on a dedicated attribution service.\
Enterprise environments that restrict outbound traffic must allow access to the following endpoint:

`https://attribution.tabnine.com`

This is the endpoint used by all current versions of Tabnine for attribution checks during code generation.

#### **Backwards compatibility**

For organizations already using the previous, legacy endpoint, Tabnine continues to support:

`https://api.tabnine.com/attribution`

This endpoint remains active for backwards compatibility. Existing customers may continue using it, although the new endpoint is recommended for improved stability and performance.

The legacy endpoint will eventually be deprecated.

### Walkthrough

Tabnine performs provenance tracing for all code generated by the AI chat. If a code block has origins in any publicly visible code on GitHub, a code provenance attribution section will appear below the block detailing the source and corresponding licenses.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-40b9f69303d323b56aeb2bb60c056346155fb1bc%2FProvenance%20%26%20Attribution%20.png?alt=media" alt=""><figcaption><p>Provenance and Attribution example</p></figcaption></figure>

When drilling down into detail, Provenance will show attributions by grouping content by license, displaying matching code snippets, and linking to any actual matches, like so:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-5f9b9084f9eb7993d9cc6afb67bc076dedc68427%2Fimage.png?alt=media" alt=""><figcaption><p>Tabnine Provenance and Attribution</p></figcaption></figure>

### Two Levels of Protection

Tabnine offers two levels of protection to minimize the risk of IP liability:

* **Training time protection**: We have trained the Tabnine Protected 2 model exclusively on code that does not have any restrictions on use. This ensures that when using this model, every recommendation from Tabnine can be accepted without the risk of IP infringement. This level of protection is valuable for companies that have strict policies and zero tolerance for using non-permissive code. This is a critical need, particularly for software companies and others who sell or relicense the code they produce.
* **Inference time protection**: Tabnine informs you if the output of the LLM matches any publicly visible code on GitHub and identifies the source repo and its license type. By adding guardrails around Tabnine’s output, we minimize the risk of IP liability of third-party models.

### Availability

The Provenance and Attribution is currently in private preview and is available to any Tabnine Enterprise customer. Existing Tabnine Enterprise customers should [contact our Support team](mailto:support@tabnine.com) to request access. Once enabled, the Provenance and Attribution capability works on all available models: Anthropic, OpenAI, Cohere, Llama, Mistral, and Tabnine.

### Censorship

Censorship will altogether prevent the generation of code snippets originating from non-permissive codebases. To activate, simply slide the <mark style="color:blue;">toggle</mark> next to **Censor code ⓘ**.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-9081bc8b18c77bdce0e73644f2ef8a5564011463%2FProv%20Attr%20Censorship.gif?alt=media" alt=""><figcaption></figcaption></figure>

#### **Censorship in Agent**

Censorship exists in [Agent](/main/getting-started/tabnine-agent) as a tool called `check_provenance`. The tool is disabled by default and must be activated in the Admin Console. It is activated by the same toggle that controls Censorship for Chat.

Auto-apply for Agent will not work once Censorship is activated. If the proposed code contains a match of more than 150 characters from non-permissive code, the Agent is instructed to rewrite only the offending portion while still addressing the original task.

After Tabnine Agent edits the code, `check_provenance` is run again to verify that non-permissive matches have been removed before apply-code can proceed.

For efficiency reasons, `check_provenance` is disabled by default and must be explicitly enabled per workspace in tool control.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-cff1d2bf238f6b904754005797030cd44f2d515e%2FSales%20Enablement%20-%205.25%2B5.26-%2025%20Nov%206'.pptx.gif?alt=media" alt=""><figcaption></figcaption></figure>

#### When is attribution and censorship checked?

Attribution and Censorship is always checked as the last step of code generation. For Tabnine Agent, when `check_provenance` is enabled, this check happens immediately before the apply-code tool executes. Custom behaviors and custom commands cannot be used to override the censorship check.

#### **Attribution in Agent**

Agentic native tools `apply_code` and `create_files` can apply attribution by showing results and their respective licensing.

When non-permissive code is detected by these tools, you will see a message such as “Create rejected,” followed by the number of attributions and their licensing restrictions. After this is shown, you can hit > Resume to instruct Tabnine Agent to try again.

In this example, non-permissive code is used twice, with a third result being permissive:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2F9gqfPvkpC4hnFqmtkEwJ%2FAgent%20Attribution.gif?alt=media&amp;token=408ec71e-c308-4e32-a5e1-36a50aa252ac" alt=""><figcaption></figcaption></figure>

### Limitations

* **Supported form factors**: Provenance and Attribution is currently supported for Tabnine Chat and Tabnine Agent.
* **System requirements**: Provenance and Attribution requires up to 10TB of free storage.
* **Supported languages:**

|                                                                                                                                                                                                                                                     |                                                                                                                                                                                                                                                         |                                                                                                                                                                                                                                                      |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-e0e096a24e59fb9f1e501899389e3905c6c27cd7%2FPython.svg?alt=media" alt="" data-size="line"> Python         | <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-d0841f2e61ed3d92232b9cd2c1fbfb4dff4853a1%2FC.svg?alt=media" alt="" data-size="line"> C                       | <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-bf0a58dacd492c76455ea18c50dd0f8a0633a143%2Fkotlin.png?alt=media" alt="" data-size="line"> Kotlin          |
| <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-7975261bd47d0112fab7f5a376e1293e56a55584%2FJavaScript.svg?alt=media" alt="" data-size="line"> Javascript | <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-6cae2226d09d9b41d074169a19955cbffa104698%2FC%2B%2B%20(CPlusPlus).svg?alt=media" alt="" data-size="line"> C++ | <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-9c651106b10695ea943eeb69b9f7839e8915a09f%2FRuby.svg?alt=media" alt="" data-size="line"> Ruby              |
| <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-e1db5f196597f0815d315dfacf4191bb3df75fa4%2FTypeScript.svg?alt=media" alt="" data-size="line"> Typescript | <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-acc487eb512c10a78f653a41a72c3f77400bf660%2FC%23%20(CSharp).svg?alt=media" alt="" data-size="line"> C#        | <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-6d3fd54a0761742ae6841dd05a5c1501a57a84cf%2FScala.svg?alt=media" alt="" data-size="line"> Scala            |
| <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-051bf254ad782820627890ef2b0e06fbae63dc6e%2FJava.svg?alt=media" alt="" data-size="line"> Java             | <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-7291b21410a92492fbd34b8d61207d9319dbd64b%2FOBJ%20C.png?alt=media" alt="" data-size="line"> Objective C       | <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-68630abe025f545b05ce17942a2b98bf454d89b7%2FSwift.svg?alt=media" alt="" data-size="line"> Swift            |
| <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-2cd0d12f79f36a4aac2ebe0364c3191a133a27ea%2FRust%20logo.png?alt=media" alt="" data-size="line"> Rust      | <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-7c0e494ebc5f01bb73eca399081d11ad384bfa8b%2FPascal.png?alt=media" alt="" data-size="line"> Pascal             | <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-4bb39ed848b2a79f39b6b315bd1b722faa3e33e2%2FApache%20Groovy.svg?alt=media" alt="" data-size="line"> Groovy |
| <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-433778040df57e9a81529c37fcb6baf70f78ee3d%2FGo.svg?alt=media" alt="" data-size="line"> Go (Golang)        | <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-f98449050bd1289a6cd3ef4df3623b19820b1d12%2Ff%20sharp%20logo.png?alt=media" alt="" data-size="line"> F#       | <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-32b7a5b44cf3018c450cd5b5e2334dbe57901f89%2FPHP.svg?alt=media" alt="" data-size="line"> PHP                |
|                                                                                                                                                                                                                                                     | <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-7c68a98d8197d8b72edc68c3de4856f6c2e5da5c%2FR.svg?alt=media" alt="" data-size="line"> R                       |                                                                                                                                                                                                                                                      |

* **Code match criteria**: At least 150 characters, and multiline.
* **Matching index**: GitHub is fully indexed, with periodic updates ensuring coverage extends beyond the model’s training data.

### Attribution Logs

Sample CSV file showing attribution logs (by default the last 14 days, which can be changed in the API):

{% file src="/files/ZEpmPPk5LTpmbvI3GVAQ" %}

The logs will have the following fields:

* `detectionId` — Unique code for the logged attribution event
* `timestamp` — Time and Date
* `userId` — The User ID
* `organizationId` — The Organization ID
* `teamId` — The Team ID
* `source` — indicates Chat, Agent, or Test
* `model` — e.g. Claude 3.5 Sonnet, Gemini3-Pro, GPT-5, etc. Available models will change over time.
* `isNonPermissive` — will have one of two values, `TRUE` or `FALSE`
* `snippet` — License information plus the code snippet itself
* `codeAttribution` — JSON data attributing the code to source
* `newFile actions count` — Amount of times a new file was created
* `apply actions count` — Amount of times code changes were applied
* `insert actions count` — Amount of times new code/changes were inserted into code
* `copy actions count` — Amount of times code was manually copied from the Agent's response

### Attribution FAQ

#### What kind of reference database does Tabnine use and how often is it updated?

The reference database is Postgres, containing signatures and their metadata. That metadata includes the license information, commit hash, repo, and number of starts among other things. It is updated about once every quarter.

#### How exactly does Tabnine determine the license that a codebase is using?

We infer the license based on the one mentioned on the GitHub repo, as well as any licensing the library has.

#### Why is it limited to certain languages?

We started with the most popular languages ([see above](#limitations)) expecting to expand our coverage over time.\
\
If there is a specific language missing that you would like, let us know and we will consider adding it.

#### Will Tabnine expand its attribution codebase?

Whenever we re-index, we also search for new repos that fit our licensing criteria.

#### What generated code is sent to the attribution service?

The code snippet is sent to the *recitation service*, which is then installed on premises. From there, we calculate the *signature hashes* in that snippet, then check a *bloom filter* to see if those signature hashes are in the *attribution database*.\
\
Only the signature hashes that are found in the bloom filter are sent to the attribution service in order to find the references.\
\
Note that no plain text code is *ever* sent to the attribution service, *only* the signature hashes.

{% hint style="info" %}
We feed the database with open source projects from GitHub *above* a certain popularity threshold.
{% endhint %}


# Provenance & Attribution in Tabnine CLI

Provenance and Attribution (P\&A) enforcement for generated code now applies to the Tabnine CLI.

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

#### **Overview**

Provenance and Attribution (P\&A) enforcement for generated code now applies to the Tabnine CLI.\
This mirrors the existing IDE behavior, preventing non‑permissive open‑source code from being suggested and adding attribution for permissive code.

#### **How it works**

All code generated by the CLI is passed through the P\&A pipeline before it is shown or applied.\
Generated output is split into small windows, hashed, and checked against an Attribution Bloom Filter and metadata service.

If a window matches code from a non‑permissive license, that snippet is censored.\
If it matches code under a permissive license, the code is allowed but accompanied by an attribution notice.

#### **Surfaces covered in the CLI**

P\&A enforcement covers all CLI code‑generation flows, including:

* `write_file` output.
* `replace` output (the `new_string` content).
* Code blocks returned in Agent chat responses.
* Any generated code that the CLI applies to the filesystem.

The user only sees code that has passed the P\&A checks.\
Blocked snippets are replaced with a clear notice rather than silently dropped.

#### **Censorship behavior**

If a snippet matches a non‑permissive license, the CLI censors that part of the output.\
The CLI displays a message such as:

`“A portion of the generated code was removed because it matched code with a non‑permissive license <license>. Source: <repo>.”`

The censored code is not written to disk or shown inline. A corresponding event is logged to the attribution log service for audit and analytics.

#### **Attribution behavior**

If a snippet matches a permissively licensed source, the code is shown normally.\
An informational line is printed alongside the output, for example:

`“Attribution: This code is similar to <repo> (<license>) — <file>:<line>.”`

Attribution messages appear in the CLI output but are not inserted into the generated files.\
This helps developers track provenance without polluting code with comments.

#### **Admin governance and configuration**

P\&A censorship uses the existing governance settings from the admin console.\
Admins can enable or disable censorship mode and control how attribution is displayed.

CLI deployments in EMT / self‑hosted environments use the same P\&A endpoints and configuration as the IDE.\
No separate policy system is required for the CLI.

#### **Logging and analytics**

Each P\&A event from the CLI is logged with timestamp, organization, user, source (`cli`), model, and license metadata.\
Two key analytics events are emitted:

* `cli_code_censored` – code blocked due to non‑permissive license.
* `cli_code_attributed` – permissive code with attribution details.

These logs help security and compliance teams monitor how P\&A is working across their estate.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2F5dwipBjiJponvZ4jf6uW%2Fpanda.gif?alt=media&amp;token=bdbb9c65-8ea7-45cc-ba67-893a9218ab5b" alt=""><figcaption></figcaption></figure>


# Personalization

Tabnine AI code assistant: Personalization

{% hint style="info" %}
Local workspace indexing/admin control changed in [v6.3.0](/main/administering-tabnine/release-notes) and that older terminology may no longer apply.
{% endhint %}

## What is personalization and why does it matter?

Tabnine’s AI code assistant — including its code completions and chat — is backed by Tabnine’s Universal AI models, which were trained on permissively licensed open source code. Like other LLMs, the Universal models were **not** **exposed to the specific data and distinctive patterns** of an organization. Consequently, they lack the context and domain knowledge that an experienced developer at an organization has, resulting in recommendations that often aren’t tailored to the developers.

Personalization is an added layer of Tabnine’s AI coding assistant that closes this gap and aims to solve the problem by increasing Tabnine's contextual awareness in three ways:

1. **Context** through local code awareness
2. **Connection** to software repository for global code awareness
3. **Customization** of an AI model

The different layers of personalization enable Tabnine’s AI coding assistant to return code suggestions, including tests, explanations, documentation, and more that are more accurate and relevant to your needs.

{% embed url="<https://youtu.be/nWXRaozjHnM>" %}

## How does Tabnine solve the personalization problem?

Tabnine uses several components to make its AI coding assistant aware of your environment. Different techniques are applied for code completions and chat; some are only available for Tabnine Enterprise plans.

* **Context through local code awareness (General availability):** Tabnine accesses information available in a developer’s local IDE workspace, applying different methods to do so: context from the open file and related files, information on types in the current scope, and **retrieval-augmented generation (RAG)**. [RAG](/main/welcome/readme/personalization/tabnines-personalization-in-depth#rag-in-tabnine) is the most effective component for all Pro and Enterprise customers. Context through local code awareness is beneficial for any individual developer and for those within a team or a big organization.
* **Connection for global code awareness (Private Preview):** Tabnine leverages the information available in the organization's code repositories, including relevant code that isn't accessible in the local IDE. [RAG](/main/welcome/readme/personalization/tabnines-personalization-in-depth#rag-in-tabnine) is the main method used to achieve this. This feature is available in Private Preview as an option for Enterprise Customers. The team admin needs to explicitly enable this feature by connecting Tabnine to the desired repos in the organization codebase. This is beneficial mainly for developers in organizations.
* **Customization (AI models fine-tuned with private code):** Tabnine leverages the information available in the whole codebase of the organization (with the admin controlling which repos will be included) through a private customized model that was retrained on the organization’s private code, making the core AI model aware of the organizational code pattern and reflecting the specific languages and frameworks used in the organization. This option is for Enterprise customers with private installation and is beneficial for larger organizations with a bespoke codebase.

These techniques and mechanisms can be applied individually or together for code completions and chat to achieve the optimal solution for each end user or organization.

## Personalization and code privacy

Code privacy is our utmost priority. The personalization layer maintains all of Tabnine’s code privacy principles:

* Your code remains private
* Tabnine does not share any of your code with third parties.
* Tabnine does not train on your code.

There are two cases when your code is sent to the Tabnine server (in Tabnine’s secure SaaS or the customer's private installation):

* **AI model inference:** When the user queries Tabnine (explicitly or implicitly), a prompt is sent to the AI model in the Tabnine server with a context window that includes some elements from your code. The sole purpose of the context window is to facilitate the most accurate answers possible.
* **Creating the chat RAG index:** The computation for vector embeddings for the chat [RAG index](/main/welcome/readme/personalization/tabnines-personalization-in-depth#the-rag-index) requires a lot of resources, and cannot be done locally without stressing the user’s machine. Tabnine performs this computation on the server GPU.

In both cases, the data is sent encrypted over SSL and is deleted immediately after returning the answer.

For global RAG, the index is retained on Tabnin servers.

Clarification about customization (an option for Tabnine Enterprise customers): Training and hosting the private customized model is done in the customer’s isolated private installation, which ensures no data is shared outside the organization.

## Personalization in Tabnine's UI

Most of the personalization impact is in the quality of the code suggestions. However, there are some UI-related ways that personalization shows up.

#### Mentions

Mentions (using the @ symbol) are a way that the user can specifically ask the Tabnine Chat to use a specific code element (type, method, or class) from the workspace in the query context. Mentions allow users to leverage their domain knowledge and help the AI by explicitly focusing it on relevant context from the workspace.

Note:

1. Mentions work for each language with a Language Server Protocol (LSP) support in the IDE.
2. Type 2-3 characters after the “@” to view the available code elements.

<figure><img src="https://lh7-us.googleusercontent.com/GGPIQKx9s7OsJxM_EbVoT1J3hRxOIm-MEJSi2NS9g92P9tpFdvPJv3qDWciBvXzNXqi6lazY15dkjyts80qP8VZRCKVl49NwroZjuPkn9r-TWydTX_ekIu25gJVMKetBlnQq3l9X2x2AlzMG05KGbW4" alt="" width="563"><figcaption></figcaption></figure>

#### References

If the context for local code awareness is enabled, by default Tabnine Agent and Chat tries to answer the user questions with context from the local workspace. When returning the answer to the user, Tabnine Agent and Chat are explicit about the context used to answer the question by including a list of references:

<figure><img src="https://lh7-us.googleusercontent.com/y-xyv2jZeBa-OTtLRiGAuhsu47FbsA288s8kLnMdoZbIbA2-Oq87dYIMRdyZuNmHTKsD83enhmcgXkTeqVfcYpBBLY4vPTTcoDiu3gLawUJJGgzuuCpoatu2hEdFtBcDlwrpAg6fChrydUTrURB7ons" alt="" width="563"><figcaption></figcaption></figure>

You can click each reference and get to the full code that was induced in Agent and Chat context.

## Personalization availability matrix

<table data-full-width="true"><thead><tr><th width="176"></th><th>Context through local code awareness</th><th>Connection for global code awareness</th><th>Customization for AI models</th></tr></thead><tbody><tr><td>Product milestone</td><td>General availability</td><td><p>Private preview</p><p>(<a href="https://www.tabnine.com/contact-us/?utm_source=docs&#x26;utm_medium=organic&#x26;utm_campaign=docs">Contact your Sales</a> rep to learn more)</p></td><td>General availability</td></tr><tr><td>Tabnine Enterprise</td><td>Yes</td><td>Yes*</td><td>Yes (Private installation only)</td></tr><tr><td>Scope</td><td>Local IDE workspace</td><td>Selected repos from the organization's codebase*</td><td>Selected repos from the organization's codebase**</td></tr><tr><td>Code completions</td><td>Yes</td><td>No</td><td>Yes</td></tr><tr><td>Agent</td><td>Yes</td><td>Yes</td><td>Yes</td></tr><tr><td>Chat</td><td>Yes</td><td>Yes</td><td>Yes</td></tr><tr><td>IDEs</td><td>VS Code, JetBrains, Visual Studio, Eclipse<br></td><td>VS Code, JetBrains, Visual Studio, Eclipse<br></td><td>VS Code, JetBrains, Visual Studio, Eclipse<br></td></tr><tr><td>Languages</td><td>All supported languages</td><td>All supported languages</td><td>All supported languages</td></tr></tbody></table>

\* For connection and customization, the team admin explicitly selects the specific repos.

### Do I need to enable the feature? Can I disable the feature?

**Context for code completions:**

* **All plans:** Enabled by default and cannot be switched off

**Context for Chat and Agent:**

* **Enterprise:** Enabled by default; the team admin can switch it off

**Note:** Users can use the [Workspace selector](#workspace-selector) to disable the context and connection for a specific query.

**Connection and customization**

* These options for Enterprise customers are off by default and the team admin needs to explicitly connect to each repo in the organization codebase.

### Enabling context through local code awareness in Tabnine Enterprise

Context through local code awareness using RAG **for code completions** is enabled for all Enterprise users, and cannot be turned off.

However, context through local code awareness using RAG **for Tabnine Chat** for all users is controlled by the team admin.

**Enterprise (private installation)**

Enabled by default; the team admin can switch it off for the whole team using the admin console


# Tabnine’s Personalization in Depth

{% hint style="info" %}
Local workspace indexing/admin control changed in [v6.3.0](/main/administering-tabnine/release-notes) and that older terminology may no longer apply.
{% endhint %}

## **Background**

The main approach Tabnine uses to return code suggestions that are more accurate and relevant for your code is to enrich the context sent to the AI with additional relevant information from the user’s code.

The additional information comes from several sources, including code from the currently open file, related or recently viewed files, chat conversion history, and more, but the most important method is **retrieval-augmented generation (RAG)**.

RAG is used both for **context** through local code awareness and **connection** to your organization's codebase.

## **RAG in Tabnine**

RAG is a common AI framework for improving the accuracy of LLM-generated answers by adding an information retrieval component that adds data and context to each query of the model.

RAG's implementation has two components:

1. **Indexing —** Tabnine builds RAG indices that enable fast and effective retrieval of relevant data. These indices are for code completions and chat, based on local code or global code, and are based on all the code in the IDE workspace or the organization’s global codebase.
2. **Querying —** With each user query to Tabnine (explicit or implicit), Tabnine retrieves relevant code context from the RAG index and adds it as a context to the prompt to the AI model. The result is a more accurate code suggestion from Tabnine, which is more relevant to the user codebase.

The following illustrates the process of a user query to Tabnine, with the personalization layer of querying from the RAG indices, in **context** through local code awareness and **connection** to your organization codebase.

<figure><img src="https://lh7-us.googleusercontent.com/v_8AG30VcLDGzkZw4tj825lr00qLwsSp0N8vtuFuYK0po19hOkHYVX3QxsuxVSAeglxt7ojL4WRD1dyaR-TfK0Eps1lKfUWB3sbqcv3fGnTSkLnHEOdUFUG1Mv5BJuBXpdIrY7Vc5HAXtENWfZjUSeQ" alt=""><figcaption><p>Context through local code awareness</p></figcaption></figure>

<figure><img src="https://lh7-us.googleusercontent.com/m4_ysoivQET4Ux31SYFNebc6X2QGXyH0vvUjRpJzn2ocY8EbOAkFKN_JuaEVzvFy1Vv6nWXaXcrF23KbeI_K2Vq5VkdfdgHttXQE-h0mI-Y1UGTwrj6y153U5Shjn0-Q6J0g7f237hjHsjLYBpg1gKw" alt=""><figcaption><p>Connection for <em>global</em> code awareness</p></figcaption></figure>

### **The RAG Index**

#### Types and Scope of Indices

Tabnine uses RAG for both 1) **context** through local code awareness and 2) **connection** to your organization's codebase. There are different RAG indices for code completions and chat. The code representation in each index is different and fits its relevant AI model.

Tabnine’s RAG indices provide:

* **Context** through local code awareness for code completions
* **Context** through local code awareness for Agent and Chat
* [**Connection**](/main/welcome/readme/personalization/connection-global-codebase-awareness) to your organization codebase for Agent and Chat

#### What files are being indexed?

Tabnine’s RAG indices include all files in the scope that meet these criteria:

* File extensions from this [table](https://github.com/codota/TabNine/blob/master/languages.yml) (there are *1,233 different extensions* listed here)
* Files with extensions other than: "`md`", "`yaml`", "`yml`", "`json`", "`lock`", "`xml`", "`gradle`", "`bash`", "`sh`", "`txt`", "`csv`".

{% hint style="info" %}
All these filetypes with these extensions can be incorporated as remote files referenced by [Context Scoping](/main/getting-started/tabnine-chat/chat-context/context-scoping): `.md, .mkd, .mdwn, .mdown, .mdtxt, .mdtext, .markdown, .yaml, .yml, .json, .xml, .gradle, bash, .sh, .txt, .ini, .properties, .prefs, .cfg, .cmake`
{% endhint %}

#### Index Life Cycle

The **context** through local code awareness indices (Completions and Chat) are created from scratch upon the first time Tabnine runs on the workspace.

After the index is built, changes are monitored and the indices are incrementally updated.

The **connection** to your organization codebase index is created after the team admin connects the repos from the customer codebase to Tabnine; it is updated regularly.

#### Indexing Process

The RAG indexing applies vector embeddings for each chunk of code in the scope (local or global).

For Code Completions, the RAG index computation runs locally on the developers’ machines.

For Chat, the RAG index computation requires *a lot* of resources. As such, it requires a GPU, which means it cannot be done locally without stressing the end user’s machine. Tabnine performs just this computation on the Tabnine server GPU (SaaS or the customer's private installation).

Your code remains private. Chunks of code are sent in an encrypted format, and Tabnine does not share your data with any third parties. The sole purpose of sending these code chunks is to compute the vector representation for indexing.

#### Index Location and Persistence

* **Local RAG (Context)**
  * The indices for Code Completions and Chat suggestions are saved on the end user’s local machine.
  * The vector database used locally is **Quadrant**.
* **Global RAG (Connection)**
  * The indices are retained on Tabnine servers.

#### Integrations for connection to your organization's codebase

Tabnine can integrate with the leading git-hosting platforms such as GitHub, GitLab, or Bitbucket. The integration keeps the existing permission models or the organization so that each user can only retrieve code from repositories that they have access to.

### VDB on Docker

Tabnine indexes the user’s codebase into a VDB embedding store (vector database) locally in memory.

Docker containerization for VDB: Achieve better resource allocation and system stability when processing your codebase. Activate by setting the `TABNINE_DOCKER_ENABLED` environment variable.

#### VDB Logs

If you have any indexing issues, please send us all the VDB logs in the relevant log folder. The logs are located in:

<table data-header-hidden><thead><tr><th width="119.68011474609375"></th><th></th></tr></thead><tbody><tr><td><strong>Platform</strong></td><td><strong>Path</strong></td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-162ed82d77744806c2aba64ef9a70a80c3e66d56%2Fmacos.png?alt=media" alt="" data-size="line">MacOS</td><td>/Users/{UserName}/Library/Application Support/TabNine/servers/vdb/1.7.3-fix.1/logs</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-094a4a86d9eede964e0367ecc9372e77542ad5ea%2Flinux.png?alt=media" alt="" data-size="line">Linux</td><td>~/.local/share/TabNine/servers/vdb/1.7.3-fix.1/logs</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-f7c9731c7a83ba2d75b0d17864d12091461bf38e%2FWindows_logo_-_2021.svg.png?alt=media" alt="" data-size="line"> Windows</td><td>C:\Users\{UserName}\AppData\Roaming\TabNine\servers\vdb\1.7.3-fix.1\logs</td></tr></tbody></table>

{% hint style="info" %}
**\* {UserName}** = current user name on your machine
{% endhint %}


# Connection: Global Codebase Awareness

{% hint style="info" %}
Local workspace indexing/admin control changed in [v6.3.0](/main/administering-tabnine/release-notes) and that older terminology may no longer apply.
{% endhint %}

### What is Connection?

Connection (Global RAG) [personalizes](/main/welcome/readme/personalization) Tabnine to your organization’s code by extending the available context for [Tabnine Chat ](/main/getting-started/tabnine-chat)to include remote/external code repositories, even if they’re not part of the local IDE workspace.

This enhances AI code suggestions, making them more accurate and relevant to the organization.

#### Why is this important?

In many cases, the relevant context for Tabnine is located in external repositories that are not included in the current project.

For example, users may need specific code that resides outside the IDE or suggestions that rely on patterns from the remote codebase.

#### Who has access to the Connection feature?

The Connection feature is available to enterprise customers in all deployments.

To enable this feature for your team, please contact your account manager.

#### How to enable this feature:

The Enterprise team admin manages the connected repositories.\
The admin can establish connections to Git providers using:

* SSH: By configuring Tabnine’s SSH key
* HTTPS: By using access tokens from the Git providers

[Learn more](/main/administering-tabnine/managing-your-team/settings/workspace-settings/connecting-to-remote-repositories).

### How does the end user work with connected repositories?

#### Context Scoping

Specify which repositories are relevant for Tabnine to use as context. Learn more about [Context Scoping](/main/getting-started/tabnine-chat/chat-context/context-scoping).

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-77d0708067af70d55c1abb77c463a8c1138b3c21%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

#### Get Answers based on References from External Repositories

Tabnine Chat may generate answers using context from remote repositories. The exact references used will appear in the "References" section.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-d35843f160d570e94dc4036847591caafc284eb0%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

### Navigate to Resource

Quickly access relevant remote code references by clicking the corresponding link. The browser will open the original source code directly within the connected Git provider.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-87b77a40d1f0c61261ac812ac078c40b2ce0ed53%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

### Which Git providers are supported?

#### Supported providers:

* GitHub
* GitLab
* Bitbucket

{% hint style="info" %}
**Note:**

Both cloud and self-hosted installations are supported, provided Tabnine servers can connect to the Git providers.
{% endhint %}

#### For other providers:

* Indexing and retrieving chat answers from external repositories generally works for most standard Git providers.
* Navigating to external repositories' references may not work consistently due to variations in URL patterns.

### Which users have access to context from the external repository?

Connections are managed at the team level.

Each user only has access to the repositories that are connected to their specific team.

### Which files are being indexed?

[Learn more](/main/welcome/readme/personalization/tabnines-personalization-in-depth#what-files-are-being-indexed)

### Indexing Process and RAG Index

* Your connected repositories are cloned to Tabnine servers for indexing and are deleted immediately after indexing is complete.
* The **RAG index** is securely retained on Tabnine servers and remains private.
* A periodic background process checks for updates in the connected repositories and refreshes the corresponding index when needed.
* This update process can take up to **one hour**.

Read more on the [Index Lifecycle](/main/welcome/readme/personalization/tabnines-personalization-in-depth#index-life-cycle).

#### Perforce

{% hint style="info" %}
This is currently in 'preview' mode. To get access, contact <support@tabnine.com>.
{% endhint %}

You can connect Perforce depots for global connection indexing.

On the **Context enhancement** page, scroll down to **Connect external Perforce depots**.

Press <mark style="background-color:blue;">**Add depot**</mark>.

Enter the depot path below and select an available Perforce server.

Then click <mark style="background-color:blue;">**Connect**</mark>.

Indexing might take a few minutes. When finished, the Perforce depot will be available in your context engine.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-a3395e284d5e7ed3fcd701a60d071018e7388680%2FScreenshot%202025-04-10%20at%2010.49.46.png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-fd3c50ed077c8a82f4028d0ba41525831525b5dc%2FPerforce%20activate.gif?alt=media" alt=""><figcaption></figcaption></figure>

To remove the depot, press the X. You can also change the depot path by clicking the edit icon.


# AI Models

Tabnine AI code assistant: AI models

Tabnine's AI coding assistance is backed by Tabnine’s proprietary AI models for code completions and chat, which are trained and hosted by Tabnine and are private and protected.

In addition, Tabnine Chat includes the option of using third-party models. The privacy policies and the protection offered by these third-party models may be different from the Tabnine models.

### Optional AI Models

Tabnine Agent and Chat users can choose from these chat models:

<table><thead><tr><th width="58.712890625"></th><th width="383.9716796875">Models</th><th width="130.6328125">Thinking Model</th><th>Tabnine CLI</th></tr></thead><tbody><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FJo8xvMdAcHQVDHp6rKqr%2Fimage.png?alt=media&amp;token=73e74187-b017-4a31-af5f-f0700de92b05" alt="" data-size="original"></td><td>Claude 4.8 Opus</td><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fy1PxkXPE4UyWlE1b0lgW%2Fimage.png?alt=media&amp;token=4e281254-647d-4776-86a0-2914cef9af54" alt="" data-size="line"></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FJo8xvMdAcHQVDHp6rKqr%2Fimage.png?alt=media&amp;token=73e74187-b017-4a31-af5f-f0700de92b05" alt="" data-size="original"></td><td>Claude 4.7 Opus</td><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fy1PxkXPE4UyWlE1b0lgW%2Fimage.png?alt=media&amp;token=4e281254-647d-4776-86a0-2914cef9af54" alt="" data-size="line"></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-0dbc6c508c902dd575a9366c0762bea4f93e2442%2Ficon%3DClaude.svg?alt=media" alt=""></td><td>Claude 4.6 Sonnet</td><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FOuilkkNxykRs9PtRkcuu%2FThinking%20Icon.png?alt=media&amp;token=e09424e2-bb50-437a-aaff-52674ec3c3fc" alt="" data-size="line"></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-0dbc6c508c902dd575a9366c0762bea4f93e2442%2Ficon%3DClaude.svg?alt=media" alt=""></td><td>Claude 4.6 Opus</td><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FOuilkkNxykRs9PtRkcuu%2FThinking%20Icon.png?alt=media&amp;token=e09424e2-bb50-437a-aaff-52674ec3c3fc" alt="" data-size="line"></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-0dbc6c508c902dd575a9366c0762bea4f93e2442%2Ficon%3DClaude.svg?alt=media" alt=""></td><td>Claude 4.5 Sonnet</td><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FOuilkkNxykRs9PtRkcuu%2FThinking%20Icon.png?alt=media&amp;token=e09424e2-bb50-437a-aaff-52674ec3c3fc" alt="" data-size="line"></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-0dbc6c508c902dd575a9366c0762bea4f93e2442%2Ficon%3DClaude.svg?alt=media" alt=""></td><td>Claude 4.5 Opus</td><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FOuilkkNxykRs9PtRkcuu%2FThinking%20Icon.png?alt=media&amp;token=e09424e2-bb50-437a-aaff-52674ec3c3fc" alt="" data-size="line"></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-0dbc6c508c902dd575a9366c0762bea4f93e2442%2Ficon%3DClaude.svg?alt=media" alt=""></td><td>Claude 4.5 Haiku</td><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FOuilkkNxykRs9PtRkcuu%2FThinking%20Icon.png?alt=media&amp;token=e09424e2-bb50-437a-aaff-52674ec3c3fc" alt="" data-size="line"></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-0dbc6c508c902dd575a9366c0762bea4f93e2442%2Ficon%3DClaude.svg?alt=media" alt=""></td><td>Claude 4 Sonnet</td><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FOuilkkNxykRs9PtRkcuu%2FThinking%20Icon.png?alt=media&amp;token=e09424e2-bb50-437a-aaff-52674ec3c3fc" alt="" data-size="line"></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FYX0vQWezXSi0HdO7TeWH%2Fimage.png?alt=media&amp;token=2f72a5ca-e3c5-471e-aca6-bd856c1221ae" alt="" data-size="original"></td><td>GPT-5.5</td><td></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FBFi46Yyjj0tL8xE8ZEad%2Ficons8-chatgpt-480.png?alt=media&amp;token=74f6a8e1-8012-4e0c-922d-94c28a32aae9" alt=""></td><td>GPT-5.4</td><td></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FBFi46Yyjj0tL8xE8ZEad%2Ficons8-chatgpt-480.png?alt=media&amp;token=74f6a8e1-8012-4e0c-922d-94c28a32aae9" alt=""></td><td>GPT-5.3 Codex</td><td></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FBFi46Yyjj0tL8xE8ZEad%2Ficons8-chatgpt-480.png?alt=media&amp;token=74f6a8e1-8012-4e0c-922d-94c28a32aae9" alt=""></td><td>GPT-5.2 Codex</td><td></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FBFi46Yyjj0tL8xE8ZEad%2Ficons8-chatgpt-480.png?alt=media&amp;token=74f6a8e1-8012-4e0c-922d-94c28a32aae9" alt=""></td><td>GPT-5.2</td><td></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FBFi46Yyjj0tL8xE8ZEad%2Ficons8-chatgpt-480.png?alt=media&amp;token=74f6a8e1-8012-4e0c-922d-94c28a32aae9" alt=""></td><td>GPT-5</td><td></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FBFi46Yyjj0tL8xE8ZEad%2Ficons8-chatgpt-480.png?alt=media&amp;token=74f6a8e1-8012-4e0c-922d-94c28a32aae9" alt=""></td><td>GPT-4o</td><td></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fj0f5EIMjzsRAiP3PXF1A%2Fimage.png?alt=media&amp;token=27d498a6-7797-4982-9d72-7c220dd7db25" alt="" data-size="original"></td><td>Gemini 3.5 Pro</td><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fy1PxkXPE4UyWlE1b0lgW%2Fimage.png?alt=media&amp;token=4e281254-647d-4776-86a0-2914cef9af54" alt="" data-size="line"></td><td></td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fj0f5EIMjzsRAiP3PXF1A%2Fimage.png?alt=media&amp;token=27d498a6-7797-4982-9d72-7c220dd7db25" alt="" data-size="original"></td><td>Gemini 3.1 Pro</td><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fy1PxkXPE4UyWlE1b0lgW%2Fimage.png?alt=media&amp;token=4e281254-647d-4776-86a0-2914cef9af54" alt="" data-size="line"></td><td></td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-64121828b35fbcbf113dba617435d1cf0d229a81%2Fgemini%20rainbow.png?alt=media" alt=""></td><td>Gemini 3.0 Pro</td><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FOuilkkNxykRs9PtRkcuu%2FThinking%20Icon.png?alt=media&amp;token=e09424e2-bb50-437a-aaff-52674ec3c3fc" alt="" data-size="line"></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FfxZflxCYxWYvBhj9fOre%2Fm-rainbow.svg?alt=media&amp;token=03a5f129-52c9-4326-9dc0-028b400462ca" alt=""></td><td>Devstral-Small-2-24B-Instruct-2512</td><td></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FfxZflxCYxWYvBhj9fOre%2Fm-rainbow.svg?alt=media&amp;token=03a5f129-52c9-4326-9dc0-028b400462ca" alt=""></td><td>Devstral-2-123B-Instruct-2512*</td><td></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FhoC55ogj5zmtKzmt4OqX%2Fminimax-color.png?alt=media&amp;token=29fe9411-a413-4c87-9766-7b8ec518d133" alt=""></td><td>MiniMax-M2.7</td><td></td><td></td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FWrseAEz3kOs3HnTQ7yNy%2Fimage.png?alt=media&amp;token=f5527196-7918-44af-a58f-10e8a1910546" alt="" data-size="original"></td><td>GLM-4.7</td><td></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FXO7Aj72XEzmJ479fAfoc%2Fimage.png?alt=media&amp;token=237205bb-8411-44ac-b3af-98f9552927cc" alt="" data-size="original"></td><td>Qwen-3-Coder-480B-A35B-Instruct</td><td></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FXO7Aj72XEzmJ479fAfoc%2Fimage.png?alt=media&amp;token=237205bb-8411-44ac-b3af-98f9552927cc" alt="" data-size="original"></td><td>Qwen-3-30B <strong>(Chat only)</strong></td><td></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr></tbody></table>

{% hint style="info" %}
\*This list changes frequently.\
\
\*\*Devstral 2 (123B parameters) is operating under a modified MIT license. If your organization's global consolidated monthly revenue is exceeding $20 million, utilizing this model requires Devstral's permission.
{% endhint %}

### Thinking Models

Thinking models highlight the steps that the model took while processing its response. Models with thinking enabled are highlighted with the brain icon:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FrsvtGikFr2flFImfLdS3%2Fimage1.gif?alt=media&amp;token=b0eabae7-3dc4-41c1-8ff6-c62f5887f2b9" alt=""><figcaption></figcaption></figure>

The thinking block delineates how the model performed and how it made its decisions. It clarifies the creation process for users by boosting transparency under the hood, highlights potential missteps (like hallucinations) when they appear in the thinking panel, and ultimately improves accuracy.

In this example, the model is asked to consider appropriate content for a new app. Opening the thinking block displays its thought process.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FxHmNktc5juQ7v5dExCaA%2FThinking%20Model%20in%20Action.gif?alt=media&amp;token=2b5065c6-5f5e-4932-8b3d-d5ab6c067739" alt=""><figcaption></figcaption></figure>

Tabnine Enterprise customers with private installation can use some of these models and more using private endpoints. [Learn more](/main/administering-tabnine/managing-your-team/settings/models-settings#private-model-endpoints-supported-by-tabnine)

### Tabnine users can choose which Tabnine model to use

Tabnine users specify their preferred model the first time they use Agent or Chat and can change it anytime.

For projects where data privacy and legal risks are less important, you can use a model optimized for performance over compliance. As you switch to working on projects that have stricter requirements for privacy and protection, you can change to a model like Tabnine Protected that's built for that purpose. The underlying LLM can be changed with just a few clicks — and Tabnine Chat adapts instantly.

**Tabnine Enterprise administrators control and specify the models that are available to their organization.** Administrators [control the available models](broken://pages/m609gp5iKLgd2O6WnAdG) for their organization. Enterprises often make strategic bets on using specific models across their organization. This update helps Tabnine to be compatible with your chosen LLM and be a part of its ecosystem and makes it easier for you to get the most out of Tabnine without evolving your LLM strategy.


# Integrations


# Atlassian Jira Integration

Tabnine AI code assistant: Atlassian Jira integration

AI agents to implement and validate Jira issues\\

You can now connect Tabnine to Atlassian Jira and take advantage of two new AI agents:

* **Jira Implementation Agent:** A user can ask Tabnine to implement a Jira issue that’s been assigned to them. Tabnine generates code for the requirements outlined in the Jira issue.
* **Jira Validation Agent:** A user can ask Tabnine to review their implementation. When a user has written code for a Jira issue, Tabnine can check if their code accurately captures the requirements outlined in the Jira issue, offering suggestions if it doesn’t.

As the first AI code assistant to offer an integration with Atlassian Jira, Tabnine enables you to accomplish macro-level tasks with a single click. You can directly ask Tabnine to implement a story, bug, task, or subtask — there’s no need to decipher requirements in a Jira issue, break it down into tasks, and feed specific prompts into an AI chat window.

## How does this capability work

To use the new agents, you must first connect Tabnine to Jira. After the connection is established, all the Jira issues assigned to you as an individual user are available in Tabnine.

You can then select a specific issue and ask Tabnine to implement it. Once you hit Enter, Tabnine generates code to meet the requirements of the Jira issue. From there, you can review and revise the code as needed before inserting it.

In addition to code generation, you can validate code with this functionality. Simply select the code you’ve written and ask AI chat if it aligns with the requirements outlined in the Jira issue.

[Learn more](/main/getting-started/tabnine-chat/chat-context/jira-connection)

## Jira issues that can be implemented with Tabnine

There’s no technical limitation on the type of Jira issues that Tabnine can implement. To ensure the most relevant and accurate output, we recommend using Tabnine for issues like stories, bugs, tasks, and subtasks (i.e., issues that represent defined and specific units of work). This keeps the communication with AI concise and makes it easier to check the responses. During implementation, you can then ask Tabnine to refine the output (as needed), review the reference files used to generate the output, and work through the follow-up questions suggested by Tabnine.

[Learn more](/main/getting-started/tabnine-chat/chat-context/jira-connection#does-the-jira-connection-work-with-any-issue-format)

## Supported matrix

|                                           | Jira Cloud | Jira Data Center\* |
| ----------------------------------------- | ---------- | ------------------ |
| Tabnine Dev                               | Yes        | No                 |
| Tabnine Enterprise (SaaS)                 | Yes        | Yes                |
| Tabnine Enterprise (private installation) | Yes\*\*    | Yes\*\*            |

* This feature supports the same [languages](/main/welcome/readme/supported-languages) and [IDEs](/main/welcome/readme/supported-ides) as the AI chat.
* To establish a connection between Tabnine and Jira, you need access to an internet connection and a browser. It’s not supported in VDI environments.
* We currently support parent issues in Jira. Issues that are children of a parent issue need to be implemented individually.
* Inline actions currently don’t support this capability.\
  \
  \*Jira Data Center version 8.20 and higher.\
  \*\*Jira Data Center: Tabnine version 5.11.0 or higher; Jira Cloud: Tabnine version 5.12.0\\

## **Enabling the Jira connection for Tabnine Enterprise**

{% hint style="info" %}
**Enterprise Self-Hosted**

Starting from version 5.12.0, the Jira connection feature for Enterprise customers in private installations is license-dependent. If this feature is not enabled for your account, contact your Tabnine Account Manager or email <support@tabnine.com>.
{% endhint %}

The Jira connection is disabled by default for Tabnine Enterprise customers. Team administrators can enable or disable this feature for the entire team through the Tabnine Admin UI. Tabnine supports integration with either [Jira Cloud](#setting-up-the-integration-for-jira-cloud) or [Jira Data Center](#setting-up-the-tabnine-integration-with-jira-data-center).

**Notes**

* Regardless of the admin setup, the end user flow and experience are the same for both integration options.
* The integration may take up to **one hour** to fully populate and become visible in users' IDEs.

### **Setting up the integration for Jira Cloud (Tabnine Enterprise SaaS)**

Enabling the Jira Cloud connection for Tabnine Enterprise SaaS is straightforward. Team administrators can toggle the feature directly in the Tabnine Admin Console.

**Steps:**

1. Log in to the Tabnine Admin Console.
2. Navigate to the [**Personalization**](https://app.tabnine.com/profile/personalization) screen.
3. Toggle the **Enable connection to Jira** switch.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-b3817330a6c9973294a874f947e3e3a4400d56b0%2Fsaas%20ent%20admin%20personalization.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

### Setting up the integration for Jira Cloud (Tabnine Enterprise Self - Hosted)

{% hint style="info" %}
This setup is available for Tabnine Enterprise customers with private installations (version 5.12.0 or higher).
{% endhint %}

Integrating Tabnine private installation with Jira Cloud requires additional configuration, as it involves creating a dedicated OAuth 2.0 App in Atlassian.

#### **Step 1: Create an OAuth 2.0 App**

1. Go to the Atlassian Developer Console.
2. From the **Resources** menu, select **Developer Console**.
3. Click **Create App**, then select **OAuth 2.0 (3LO Integration)**.
4. Enter a name for your application and accept Atlassian’s developer terms.

   <figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-dff1801c9f2d41d17816b4224c01f83b533f4ac3%2FJira%20SH-cloud1.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>
5. You'll be redirected to the **My Apps** overview page.

   * Navigate to **Authorization** and provide a callback URL.

   <figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-0c33c15da63c910f5692541dae3bc10a42331543%2FJira%20SH%20-Cloud%202.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>
6. Add the following required permissions to your app:

   * `read:me`
   * `read:account`
   * `read:jira-work`
   * `read:jira-user`

   <figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-7cc8a1d728b4af220e3f59e010e678302101d45d%2FJira%20SH%20-Cloud%203.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

   <figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-bddd35fe35b2458d0b4dfb280d91e7e796686ca5%2FJira%20SH%20-Cloud%204.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>
7. Go to **Distribution** and complete the form to share your app.

   <figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-fe47c1cee3b08b590db64cb6a810b27aa92af22b%2FJira%20SH%20-Cloud%205.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

#### **Step 2: Enter OAuth Application credentials in the Tabnine Admin Console**

1. Copy your OAuth 2.0 application credentials from Atlassian:
   * Navigate to **Overview > App Details**.
   * Copy the **Client ID** and **Client Secret**.
2. Log in to the Tabnine Admin Console:

   * Navigate to **Settings > Workspace**.
   * Locate the **Enable Jira connection** section.
   * Enable the **Jira Cloud** option.
   * Enter the following details:
     * Client ID
     * Client Secret
     * Jira Data Center URL (if applicable)
   * Click **Save**.

   <figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-4ac0c7da6040e9efad60e6b92d92beab0aac46dd%2FSH%20Jira%20Cloud%206.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

### **Setting up the Tabnine integration with Jira Data Center**

{% hint style="info" %}
**Note**

* The Tabnine integration with Jira Data Center is available to Tabnine Enterprise customers with private installation (version 5.11.0 or higher).
* Supports Jira Data Center version 8.20 and higher.
  {% endhint %}

Integrating Tabnine with Jira Data Center requires additional configuration beyond simply enabling the toggle. Follow these steps:

#### Step 1: Set up a Tabnine application link in your Jira Data Center installation

1. Go to [Atlassian Developer](https://developer.atlassian.com/).
2. Navigate to **Resources** **> Developer Console.**
3. Click on **Create App** and then click on **OAuth 2.0 (3LO Integration)**.
4. Enter a name for your application and accept Atlassian’s developer terms.
5. Navigate to **Administration > Applications > Application links**.
6. Select **Create link**.
7. Choose **External application**, and set the direction to **Incoming**.
8. In the following screen, complete the fields as follows:
   * **Name:** Enter a unique name for the application link.
   * **Redirect URL:** Enter the callback URL from the Tabnine admin application. This URL will redirect users after authorization and should be your Tabnine server URL followed by `/app/auth/jira`. For example: `https://private-tabnine.company.com/app/auth/jira`.
   * **Permission:** Set the permission to **Read** (defines which permissions the application has on your instance).

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-78828f55e05cbc8d3e92feadceb803a3ce830049%2FJira%20DC%20-%20create%20link.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

#### Step 2: Enter Data Center Application credentials in the Tabnine Admin Console

After creating the application link in your Data Center instance, input the application credentials in the Tabnine Admin Console:

1. Ensure you have the **Client ID** and **Client Secret** from your Jira Data Center application:
   * Go to **Administration > Application links** in your Jira Data Center.
   * Locate the relevant application link and select **More actions > View credentials**.
   * Copy the **Client ID** and **Client Secret**.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-417e519356863acfef25670624edf2bd0b1367f5%2FJira%20DC%20-%20credentials.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

2. In the Tabnine Admin Console:

   * Navigate to **Settings > Workspace**.
   * Find the **Enable Jira connection** section and toggle it on.
   * Click **Edit.**
   * Enter the **Client ID**, **Client Secret**, and your **Jira Data Center URL**.
   * Click **Save**.

   <figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-1091293ad0e94d6d792e50ce7948ecc5ad88781f%2FJira%20DC%20Tabnine%20credentials.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

\*Configure CA for Jira Integration with Jira Data Center Using a Self-Signed Certificate (If Needed): To enable secure communication between Jira Data Center and Tabnine's authentication service when using a self-signed certificate, you need to configure a Certificate Authority (CA) and add it to the Helm values of Tabnine’s auth service. This ensures the authentication service recognizes and trusts the self-signed certificate. Follow these steps to set up the CA:

1. Set the environment variable Set the Base64-encoded CA certificate as the JIRA\_DC\_ADD\_SSL\_CERTIFICATE\_BASE64 environment variable:

JIRA\_DC\_ADD\_SSL\_CERTIFICATE\_BASE64=$(cat full-chain.pem | base64)

2. Add CA cert to the local trust store We need this step to avoid TLS issues in the IDE using the Jira connection.
3. Verify the Configuration Verify that Tabnine’s authentication service can connect securely to Jira Data Center using the self-signed certificate by initiating Jira connection flow from IDE.

## FAQ

#### **What context is utilized by Tabnine for the Jira connection?**

For the Jira connection, Tabnine leverages the text in the Jira issue’s title and description as context for implementing the issue and for reviewing the implementation. We currently don't use the following as context:

* Images that are included in the Jira issue
* Comments added to the issue
* History
* Links in the issue
* Related issues
* Design specs like Figma

In addition to using the information in Jira issues as context, Tabnine continues to use locally available code and information in your IDE and (for Enterprise users) your organization’s global codebases to generate responses tailored to you and your organization.

[Learn more](/main/getting-started/tabnine-chat/chat-context/jira-connection#does-the-jira-connection-work-with-any-issue-format)

#### Who has access to this capability?

This capability is available to Tabnine users on the Pro and Enterprise tiers.

#### What control do Tabnine administrators have?

This feature is disabled by default for Enterprise customers, but enabled by default for all other Tabnine chat users.

Tabnine administrators (at enterprise SaaS or private installation) can enable it. The administrators can enable the feature themselves without contacting our Support team. Once enabled, this feature is available to all Tabnine users at the company. The end users of Tabnine can then connect Tabnine to Jira themselves. Please note, this is a client-side integration.

Tabnine leverages Jira user permissions during connection ensuring that only issues assigned to a developer are accessible to them.


# System & Hardware Requirements

Tabnine AI code assistant: System requirements


# Tabnine Client & Deployment Requirements

## Tabnine Client Requirements <a href="#tabnine-client-ide-plugin" id="tabnine-client-ide-plugin"></a>

The Tabnine client runs as an IDE plugin/extension on the end user's machine.

**Machine specs**

* OS/Arch of the following:
  * Windows (Windows 10+), x86\_64 or i686
  * Linux (kernel 6.2+), x86\_64
  * Mac OS (13+), x86\_64 or aarch64
* 16 GB+ RAM
* 8+ CPU cores
* Storage: 100 GB available space

**Supported IDEs**

<table><thead><tr><th width="46"></th><th>IDE</th><th>Minimal supported version</th><th>Latest supported version</th><th data-type="checkbox">Windows OS</th><th data-type="checkbox">Mac OS</th><th data-type="checkbox">Linux OS</th></tr></thead><tbody><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-d6a3275f1b33c468b61ce3faf912a0fc5a134a7b%2Fvsc.webp?alt=media" alt="" data-size="line"></td><td>VS Code</td><td>1.93.1</td><td>1.129.0</td><td>true</td><td>true</td><td>true</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-74716d5d81d7c0b8ecb601c7d0ac00a6bda75c6b%2FJetBrains.png?alt=media" alt="" data-size="line"></td><td>JetBrains IDEs*</td><td>2023.3</td><td>2026.2</td><td>true</td><td>true</td><td>true</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-dd5c75287f8ff150beba6ccb574e490613d88d2c%2Feclipse%20logo.webp?alt=media" alt="" data-size="line"></td><td>Eclipse</td><td>4.28 (2023-06)</td><td>4.40 (2026-06)</td><td>true</td><td>true</td><td>true</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-0920f6c4e65f036c6c903f4f4357aa6baf40aee1%2Fvs.webp?alt=media" alt="" data-size="line"></td><td>Visual Studio 2022</td><td>17.8</td><td>17.14</td><td>true</td><td>false</td><td>false</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FnAs1fEuLCy9uwHFbqPXC%2FVs2026_logo.png?alt=media&amp;token=a45e1da6-d62a-4139-a3e4-d9b985c3d090" alt=""></td><td>Visual Studio 2026</td><td>18.1</td><td>18.7</td><td>true</td><td>false</td><td>false</td></tr></tbody></table>

*\* JetBrains IDEs including IntelliJ, PyCharm, WebStorm, PhpStorm, GoLand, RubyMine, CLion, AppCode, Rider, DataGrip, and Android Studio*

**Network connection**

* Connection to the Tabnine cluster on port 443
* Recommended for the initial install: Access to the IDE marketplaces (i.e., VS Code\
  Marketplace, JetBrains Plugin Marketplace)

**Permissions**

* Execute permissions for the following executables:
  * `TabNine`
  * `TabNine-deep-local`
  * `TabNine-deep-cloud`
  * `WD-TabNine`
  * `TabNine-server-runner`
  * `vdb`
  * `jdtls`
  * `typescript-language-server`
  * `Node.js`
* Write and execute permissions for the following machine paths:
  * Linux: `~/.config & ~/.tabnine`
  * Mac OS: `/Users/{{username}}/Library/Preferences & /Users/{{username}}/Library/Application Support`
  * Windows: <mark style="color:yellow;background-color:blue;">`C:\Users\{{username}}\AppData\Roaming\`</mark>


# Tabnine Deployment Options

Tabnine AI code assistant: System requirements

Tabnine can be deployed in one of the following ways:

1. Single/Multi-Tenant SaaS
2. Private cloud / On-prem installation using open-weight models
3. Private cloud / On-prem installation using private API endpoints

### Single/Multi-Tenant SaaS

This deployment allows you to utilize Tabnine’s private LLM endpoints to support both Chat and Agentic workflows.

#### **Models**

These utilize the following families of LLMs for both Chat and Agent:

* GPT
* Claude
* Gemini

#### **Hardware Requirements**

*None.*

### Private Cloud / On-Prem Installation Using Open-Weight AI Models

You can also power Tabnine by supporting open-weight models that are installed on-premises or on one of the private clouds mentioned above.

### **Models**

For Self-Hosted (SH) customers, your hardware needs depend on whether or not you already have any open-weight models within your infrastructure.

{% hint style="warning" %}
The following models are no longer be supported, starting version 6.2.0:

* Tabnine-protected
* Gemma
* Qwen 2.5 or lower
  {% endhint %}

<table><thead><tr><th width="60.564453125"></th><th width="383.9716796875">Open-Weight Models that Tabnine supports as part of an On-Prem installation</th></tr></thead><tbody><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fk9XbZ4PLifhgdoGRZPwK%2Fimage.png?alt=media&#x26;token=b227c69f-963d-4584-b585-b6ddbefaedd4" alt=""></td><td>thinkingmachines/Inkling-Small</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-127373e6093c8f4374754d6a00258d8834a6960c%2Fimage%20(3).png?alt=media" alt="" data-size="original"></td><td>Poolside/Laguna-XS.2</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FhoC55ogj5zmtKzmt4OqX%2Fminimax-color.png?alt=media&#x26;token=29fe9411-a413-4c87-9766-7b8ec518d133" alt=""></td><td>MiniMax up to M2.5</td></tr><tr><td><img src="https://sites.gitbook.com/preview/site_AIYf2/~gitbook/image?url=https%3A%2F%2F3436682446-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FY2qxVf5VTm3fmwP4B4Gx%252Fuploads%252FpnWd1QQl5f68JN0eCLnq%252FScreenshot%25202026-01-07%2520at%252012.33.37.png%3Falt%3Dmedia%26token%3D77bc312c-7f66-41e1-b4b7-0388c8cc17d3&#x26;width=300&#x26;dpr=3&#x26;quality=100&#x26;sign=3ba8b2e1&#x26;sv=2" alt=""></td><td>GLM up to 5.2</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-c800c1f921f0a9179574471daa68624e65ee8aa7%2FTransparent%20Qwen%20logo.png?alt=media" alt=""></td><td>Qwen/Qwen3.8-27B</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FfxZflxCYxWYvBhj9fOre%2Fm-rainbow.svg?alt=media&#x26;token=03a5f129-52c9-4326-9dc0-028b400462ca" alt=""></td><td>Devstral-Small-2-24B-Instruct-2512</td></tr></tbody></table>

In the absence of a pre-configured model, Tabnine provides on-premises installation services for supported models:

<table><thead><tr><th width="58.478515625"></th><th width="383.9716796875">Open-Weight Models that Tabnine Offers to Install On-Prem</th></tr></thead><tbody><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FwSLIQ7ohyAlqwASVTmFa%2Fimage.png?alt=media&#x26;token=94b5190c-e565-483f-a104-9fa9792cf9b3" alt=""></td><td>thinkingmachines/Inkling-Small</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-127373e6093c8f4374754d6a00258d8834a6960c%2Fimage%20(3).png?alt=media" alt="" data-size="original"></td><td>Poolside/Laguna-XS.2</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2F06MzGfpsB5lwhtie7R4R%2Fimage.png?alt=media&#x26;token=a59ef26c-ecc4-41b0-888f-2220db9eeb33" alt="" data-size="original"></td><td>GLM 5.2</td></tr></tbody></table>

{% hint style="info" %}
The following models are supported by Tabnine, but operate under a specific license and might require the customer to seek an approval from their owner:<br>

* Devstral 2 (123B parameters)
* Minimax M3 and M2.7
  {% endhint %}

#### **Hardware Requirements**

Installation requirements vary based on your specific use case. Please refer to the tables below to ensure optimal performance for both agentic workflows *and* chat features.

**Agent + Chat**

<table><thead><tr><th width="60.376953125"></th><th width="162.20703125">Agent + Chat</th><th width="144.353515625"></th><th width="128.90625">≤100 Users</th><th>101-500 Users</th><th>501-1000 Users</th><th>1001-2000 Users</th></tr></thead><tbody><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fe7MMWkPQsMtt1KpQQzL4%2Fimage.png?alt=media&#x26;token=21e67403-c29c-4a35-83b0-f5962369f84c" alt=""></td><td>thinkingmachines/Inkling-Small</td><td><em><strong>Recommended</strong></em></td><td><strong>4 H100 / 2 H200</strong></td><td><strong>8 H200 / 2 B200</strong></td><td><strong>2 B200</strong></td><td><strong>4 B200</strong></td></tr><tr><td></td><td></td><td>Minimum</td><td>4 H100 / 2 H200</td><td>4 H200 / 2 B200</td><td>2 B200 / 8 H200</td><td>4 B200 / 16 H200</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-127373e6093c8f4374754d6a00258d8834a6960c%2Fimage%20(3).png?alt=media" alt="" data-size="original"></td><td>Poolside/Laguna-XS.2</td><td><em><strong>Recommended</strong></em></td><td><strong>4 H100</strong></td><td><strong>4 H100</strong></td><td><strong>8 H100</strong></td><td><strong>8 H100</strong></td></tr><tr><td></td><td></td><td>Minimum</td><td>2 H100</td><td>4 H100</td><td>4 H100</td><td>4 H100</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FpnWd1QQl5f68JN0eCLnq%2FScreenshot%202026-01-07%20at%2012.33.37.png?alt=media&#x26;token=77bc312c-7f66-41e1-b4b7-0388c8cc17d3" alt=""></td><td>GLM-5.2</td><td><em><strong>Recommended</strong></em></td><td><strong>8 H200</strong></td><td><strong>8 B200</strong></td><td><strong>8 B200</strong></td><td><strong>16 B200</strong></td></tr><tr><td></td><td></td><td>Minimum</td><td>8 H200</td><td>8 H200</td><td>8 B200 / 16 H200</td><td>16 B200</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FhoC55ogj5zmtKzmt4OqX%2Fminimax-color.png?alt=media&#x26;token=29fe9411-a413-4c87-9766-7b8ec518d133" alt=""></td><td>MiniMax-M2.5</td><td><em><strong>Recommended</strong></em></td><td><strong>2 B200</strong></td><td><strong>4 B200</strong></td><td><strong>8 B200</strong></td><td><strong>16 B200</strong></td></tr><tr><td></td><td></td><td>Minimum</td><td>2 H200</td><td>4 H200</td><td>8 H200</td><td>16 H200</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-c800c1f921f0a9179574471daa68624e65ee8aa7%2FTransparent%20Qwen%20logo.png?alt=media" alt=""></td><td>Qwen/Qwen3.8-27B *</td><td><em><strong>Recommended</strong></em></td><td><strong>4 H100</strong></td><td><strong>8 H100</strong></td><td><strong>8 H200 / 2 B200</strong></td><td><strong>4 B200</strong></td></tr><tr><td></td><td></td><td>Minimum</td><td>4 H100</td><td>8 H100</td><td>8 H200 / 2 B200</td><td>4 B200</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FfxZflxCYxWYvBhj9fOre%2Fm-rainbow.svg?alt=media&#x26;token=03a5f129-52c9-4326-9dc0-028b400462ca" alt=""></td><td>Devstral-Small-2-24B-Instruct-2512</td><td><em><strong>Recommended</strong></em></td><td><strong>2 B200</strong></td><td><strong>2 B200</strong></td><td><strong>4 B200</strong></td><td><strong>8 B200</strong></td></tr><tr><td></td><td></td><td>Minimum</td><td>2 H100</td><td>4 H100</td><td>8 H100</td><td>16 H100</td></tr></tbody></table>

\* For Agent workflows, run Qwen3.8-27B with `{"reasoning_effort": "high"}` or `{"reasoning_effort": "medium"}`. The hardware table above assumes high reasoning effort. Medium reasoning effort cuts the hardware requirements roughly in half. It reduces token usage and wall time while preserving most of the model's capability. For more information, visit [artificialanalysis.ai](https://artificialanalysis.ai/evaluations/terminalbench-v2-1?models=qwen3-8-27b%2Cqwen3-8-27b-medium%2Cqwen3-8-27b-low).

Recommended hardware with medium reasoning effort:

| ≤100 Users | 101-500 Users | 501-1000 Users | 1001-2000 Users |
| ---------- | ------------- | -------------- | --------------- |
| 2 H100     | 4 H100        | 4 H200         | 2 B200          |

**Chat&#x20;*****Only***

<table><thead><tr><th width="59.955078125"></th><th width="160.408203125">Chat Only</th><th width="144.236328125"></th><th>≤100 Users</th><th>101-500 Users</th><th>501-1000 Users</th><th>1001-2000 Users</th></tr></thead><tbody><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fe7MMWkPQsMtt1KpQQzL4%2Fimage.png?alt=media&#x26;token=21e67403-c29c-4a35-83b0-f5962369f84c" alt=""></td><td>thinkingmachines/Inkling-Small</td><td><em><strong>Recommended</strong></em></td><td><strong>4 H100 / 2 H200</strong></td><td><strong>4 H100 / 2 H200</strong></td><td><strong>4 H100</strong></td><td><strong>2 B200 / 8 H200</strong></td></tr><tr><td></td><td></td><td>Minimum</td><td>4 H100 / 2 H200</td><td>4 H100 / 2 H200</td><td>4 H100</td><td>2 B200 / 8 H200</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-127373e6093c8f4374754d6a00258d8834a6960c%2Fimage%20(3).png?alt=media" alt="" data-size="original"></td><td>Poolside/Laguna-XS.2</td><td><em><strong>Recommended</strong></em></td><td><strong>2 H100</strong></td><td><strong>2 H100</strong></td><td><strong>2 H100</strong></td><td><strong>4 H100</strong></td></tr><tr><td></td><td></td><td>Minimum</td><td>2 H100</td><td>2 H100</td><td>2 H100</td><td>4 H100</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FpnWd1QQl5f68JN0eCLnq%2FScreenshot%202026-01-07%20at%2012.33.37.png?alt=media&#x26;token=77bc312c-7f66-41e1-b4b7-0388c8cc17d3" alt=""></td><td>GLM-5.2</td><td><em><strong>Recommended</strong></em></td><td><strong>8 H200</strong></td><td><strong>8 H200</strong></td><td><strong>8 H200</strong></td><td><strong>8 B200</strong></td></tr><tr><td></td><td></td><td>Minimum</td><td>8 H200</td><td>8 H200</td><td>8 H200</td><td>8 B200 / 16 H200</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FyJNXhPt7EefJ5JHa3C8w%2Fimage.png?alt=media&#x26;token=1abbf06e-e2f3-429e-89be-6a7d64715275" alt=""></td><td>MiniMax-M2.5</td><td><em><strong>Recommended</strong></em></td><td><strong>2 B200</strong></td><td><strong>2 B200</strong></td><td><strong>2 B200</strong></td><td><strong>4 B200</strong></td></tr><tr><td></td><td></td><td>Minimum</td><td>2 H200</td><td>2 H200 or<br>4 H100</td><td>4 H200 or<br>8 H100</td><td>8 H200</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-c800c1f921f0a9179574471daa68624e65ee8aa7%2FTransparent%20Qwen%20logo.png?alt=media" alt=""></td><td>Qwen/Qwen3.8-27B *</td><td><em><strong>Recommended</strong></em></td><td><strong>2 H100</strong></td><td><strong>2 H100</strong></td><td><strong>4 H100 / 2 H200</strong></td><td><strong>8 H100 / 4 B200</strong></td></tr><tr><td></td><td></td><td>Minimum</td><td>2 H100</td><td>2 H100</td><td>4 H100 / 2 H200</td><td>8 H100 / 4 B200</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Femal1wRIrrOiV5QD59C2%2Fimage.png?alt=media&#x26;token=04c3d35a-2a7c-45db-82e2-f70e66f1d6d4" alt=""></td><td>Devstral-Small-2-24B-Instruct-2512</td><td><em><strong>Recommended</strong></em></td><td><strong>2 B200</strong></td><td><strong>2 B200</strong></td><td><strong>2 B200</strong></td><td><strong>2 B200</strong></td></tr><tr><td></td><td></td><td>Minimum</td><td>2 H100</td><td>2 H100</td><td>2 H100</td><td>4 H100</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2F06MzGfpsB5lwhtie7R4R%2Fimage.png?alt=media&#x26;token=a59ef26c-ecc4-41b0-888f-2220db9eeb33" alt=""></td><td>GLM-4.7</td><td><em><strong>Recommended</strong></em></td><td><strong>2 B200</strong></td><td><strong>2 B200</strong></td><td>4 B200</td><td><strong>4 B200</strong></td></tr><tr><td></td><td></td><td>Minimum</td><td>8 H100</td><td>2 B200</td><td>2 B200</td><td>4 B200</td></tr></tbody></table>

\* For Chat-only workflows, run Qwen3.8-27B with `{"reasoning_effort": "low"}`.

**GPU Availability by Cloud Provider**

<table><thead><tr><th width="96.6875">GPU</th><th>AWS</th><th>Azure</th><th>GCP</th></tr></thead><tbody><tr><td>H100</td><td>p5.4xlarge (H100 80GB)</td><td>NC40ads_H100_v5 (H100 94GB)</td><td>a3-highgpu-1g (H100 80GB)</td></tr><tr><td>H200</td><td>p5en.48xlarge (8×H200 141GB)</td><td>ND96isr_H200_v5 (8×H200 141GB)</td><td>a3-ultragpu-8g (8×H200 141GB)</td></tr><tr><td>B200</td><td>p6-b200.48xlarge (8×B200 HBM3e)</td><td>ND128isr_NDR_GB200_v6 (4×Blackwell 192GB)</td><td>a4-highgpu-8g (8×B200 HBM3e)</td></tr></tbody></table>

{% hint style="info" %}
If you wish to use an open-weight model that is not included on this list, please contact our support team for a custom assessment.
{% endhint %}

### Open-Weight Model Installation

#### Inkling-Small

{% tabs %}
{% tab title="Standalone Docker" %} <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fr7yJ4dKMqczlIfYY4n8G%2Fdocker%20logo.png?alt=media&amp;token=99583e26-1e5a-4efb-90b0-f59103d53b08" alt="" data-size="line"> **Automated Startup Script:**

```bash
#!/bin/bash
set -e

# 1. Install Docker
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl gnupg software-properties-common
curl -fsSL https://get.docker.com | sudo sh

# 2. Install NVIDIA Container Toolkit (required for --gpus all)
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
  | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -fsSL https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
  | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \
  | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

# 3. Persistent HF cache
sudo mkdir -p /home/ubuntu/data

# 4. Launch vLLM container (Optimized for 4xH100)
sudo docker run -d --gpus all --ipc=host \
  --name inkling-small-vllm \
  -p 0.0.0.0:8000:8000 \
  -v /home/ubuntu/data:/hf_cache \
  -e HF_HOME=/hf_cache \
  -e SAFETENSORS_FAST_GPU=1 \
  -e VLLM_SERVER_DEV_MODE=1 \
  -e VLLM_USE_V2_MODEL_RUNNER=1 \
  -e FLASH_ATTENTION_CUTE_DSL_CACHE_ENABLED=1 \
  vllm/vllm-openai:v0.28.0 \
  --model thinkingmachines/Inkling-Small-NVFP4 \
  --served-model-name thinkingmachines/Inkling-Small-NVFP4 \
  --port 8000 \
  --tensor-parallel-size 4 \
  --enable-expert-parallel \
  --tokenizer-mode inkling \
  --reasoning-parser inkling \
  --tool-call-parser inkling \
  --enable-auto-tool-choice \
  --speculative-config '{"method": "mtp", "num_speculative_tokens": 4}' \
  --kernel-config.enable_flashinfer_autotune=False \
  --trust-remote-code \
  --max-model-len 180000 \
  --max-num-seqs 128 \
  --gpu-memory-utilization 0.9 \
  --kv-cache-dtype bfloat16
```

{% endtab %}

{% tab title="Kubernetes" %}

#### 1. Namespace Creation

```bash
kubectl create namespace llm-inference
```

#### 2. Deployment Manifest — Optimized for 4×H100

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: inkling-small-vllm
  namespace: llm-inference
spec:
  replicas: 1
  selector:
    matchLabels:
      app: inkling-small-vllm
  template:
    metadata:
      labels:
        app: inkling-small-vllm
    spec:
      containers:
        - name: vllm-container
          image: vllm/vllm-openai:v0.28.0
          args:
            - "--model"
            - "thinkingmachines/Inkling-Small-NVFP4"
            - "--served-model-name"
            - "thinkingmachines/Inkling-Small-NVFP4"
            - "--port"
            - "8000"
            - "--tensor-parallel-size"
            - "4"
            - "--enable-expert-parallel"
            - "--tokenizer-mode"
            - "inkling"
            - "--reasoning-parser"
            - "inkling"
            - "--tool-call-parser"
            - "inkling"
            - "--enable-auto-tool-choice"
            - "--speculative-config"
            - '{"method": "mtp", "num_speculative_tokens": 4}'
            - "--kernel-config.enable_flashinfer_autotune=False"
            - "--trust-remote-code"
            - "--max-model-len"
            - "180000"
            - "--max-num-seqs"
            - "128"
            - "--gpu-memory-utilization"
            - "0.9"
            - "--kv-cache-dtype"
            - "bfloat16"
          ports:
            - containerPort: 8000
          env:
            - name: HF_HOME
              value: "/hf_cache"
            - name: SAFETENSORS_FAST_GPU
              value: "1"
            - name: VLLM_SERVER_DEV_MODE
              value: "1"
            - name: VLLM_USE_V2_MODEL_RUNNER
              value: "1"
            - name: FLASH_ATTENTION_CUTE_DSL_CACHE_ENABLED
              value: "1"
          resources:
            limits:
              nvidia.com/gpu: 4
          volumeMounts:
            - name: cache-volume
              mountPath: /hf_cache
            - name: dshm
              mountPath: /dev/shm
      volumes:
        - name: cache-volume
          emptyDir: {}
        - name: dshm
          emptyDir:
            medium: Memory
            sizeLimit: "16Gi"
```

#### 3. Service Manifest

```yaml
apiVersion: v1
kind: Service
metadata:
  name: inkling-small-service
  namespace: llm-inference
spec:
  selector:
    app: inkling-small-vllm
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8000
```

#### 4. Verification Commands

```bash
kubectl logs -f deployment/inkling-small-vllm -n llm-inference
kubectl get pods,svc -n llm-inference
```

**In-cluster endpoint:** `http://inkling-small-service.llm-inference.svc.cluster.local/v1`
{% endtab %}
{% endtabs %}

#### Poolside/Laguna-XS.2

{% tabs %}
{% tab title="Standalone Docker" %} <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fr7yJ4dKMqczlIfYY4n8G%2Fdocker%20logo.png?alt=media&#x26;token=99583e26-1e5a-4efb-90b0-f59103d53b08" alt="" data-size="line"> **Execution Script:**

```bash
#!/bin/bash
set -e
# 1. System Preparation & Docker Install
apt update
apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
usermod -aG docker $USER
# 2. Local Cache Directory
mkdir -p /home/ubuntu/data
chown -R $USER:$USER /home/ubuntu/data
# 3. Execution (Optimized for 8x H100)
sudo docker run -d --gpus all \
  --name poolside-laguna-vllm \
  -p 0.0.0.0:8000:8000 \
  -v /root/.cache/huggingface:/root/.cache/huggingface \
  -e SAFETENSORS_FAST_GPU=1 \
  -e VLLM_SERVER_DEV_MODE=1 \
  -e VLLM_USE_DEEP_GEMM=0 \
  -e VLLM_USE_FLASHINFER_MOE_FP16=1 \
  -e VLLM_FLASHINFER_MOE_BACKEND=throughput \
  vllm/vllm-openai:v0.22.0 \
  --model poolside/Laguna-XS.2-FP8 \
  --served-model-name poolside/Laguna-XS.2-FP8 \
  --port 8000 \
  --tensor-parallel-size 4 \
  --enable-expert-parallel \
  --trust-remote-code \
  --tool-call-parser poolside_v1 \
  --reasoning-parser poolside_v1 \
  --enable-auto-tool-choice \
  --default-chat-template-kwargs '{"enable_thinking": true}' \
  --async-scheduling \
  --max-model-len 131072 \
  --max-num-seqs 128 \
  --gpu-memory-utilization 0.95 \
  --kv-cache-dtype fp8 \
  --override-generation-config '{"max_new_tokens": 16384}'
```

{% endtab %}

{% tab title="Kubernetes" %}
![](https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fltwyft3JLUiTn7mmPqae%2Fkubernetes%20logo.png?alt=media\&token=eb7900fc-82f5-4711-8755-c9cc4d895c97)

**1. Create Namespace**

```bash
kubectl create namespace llm-inference
```

**2. Deployment Manifest (`poolside-laguna.yaml`)**

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: laguna-vllm
  namespace: llm-inference
spec:
  replicas: 1
  selector:
    matchLabels:
      app: laguna-vllm
  template:
    metadata:
      labels:
        app: laguna-vllm
    spec:
      containers:
        - name: vllm-container
          image: vllm/vllm-openai:v0.22.0
          args:
            - "--model"
            - "poolside/Laguna-XS.2-FP8"
            - "--served-model-name"
            - "poolside/Laguna-XS.2-FP8"
            - "--port"
            - "8000"
            - "--tensor-parallel-size"
            - "4"
            - "--enable-expert-parallel"
            - "--trust-remote-code"
            - "--tool-call-parser"
            - "poolside_v1"
            - "--reasoning-parser"
            - "poolside_v1"
            - "--enable-auto-tool-choice"
            - "--default-chat-template-kwargs"
            - '{"enable_thinking": true}'
            - "--async-scheduling"
            - "--max-model-len"
            - "131072"
            - "--max-num-seqs"
            - "128"
            - "--gpu-memory-utilization"
            - "0.95"
            - "--kv-cache-dtype"
            - "fp8"
            - "--override-generation-config"
            - '{"max_new_tokens": 16384}'
          env:
            - name: HF_HOME
              value: "/hf_cache"
            - name: SAFETENSORS_FAST_GPU
              value: "1"
            - name: VLLM_SERVER_DEV_MODE
              value: "1"
            - name: VLLM_USE_DEEP_GEMM
              value: "0"
            - name: VLLM_USE_FLASHINFER_MOE_FP16
              value: "1"
            - name: VLLM_FLASHINFER_MOE_BACKEND
              value: "throughput"
          resources:
            limits:
              nvidia.com/gpu: 4
          volumeMounts:
            - name: cache-volume
              mountPath: /hf_cache
            - name: dshm
              mountPath: /dev/shm
      volumes:
        - name: cache-volume
          emptyDir: {}
        - name: dshm
          emptyDir:
            medium: Memory
            sizeLimit: "16Gi"

```

{% endtab %}
{% endtabs %}

#### GLM 5.2

{% tabs %}
{% tab title="Standalone Docker" %} <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fr7yJ4dKMqczlIfYY4n8G%2Fdocker%20logo.png?alt=media&#x26;token=99583e26-1e5a-4efb-90b0-f59103d53b08" alt="" data-size="line"> **Automated Startup Script:**

```bash
#!/bin/bash
set -e

# 1. Install Docker
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl gnupg software-properties-common
curl -fsSL https://get.docker.com | sudo sh

# 2. Install NVIDIA Container Toolkit (required for --gpus all)
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
  | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -fsSL https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
  | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \
  | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

# 3. Persistent HF cache
sudo mkdir -p /home/ubuntu/data

# 4. Launch vLLM container (Optimized for 8xH200)
sudo docker run -d --gpus all \
  --name glm-5-2-vllm \
  -p 0.0.0.0:8000:8000 \
  -v /home/ubuntu/data:/hf_cache \
  -e HF_HOME=/hf_cache \
  -e SAFETENSORS_FAST_GPU=1 \
  -e VLLM_SERVER_DEV_MODE=1 \
  vllm/vllm-openai:v0.23.0 \
  --model zai-org/GLM-5.2-FP8 \
  --served-model-name zai-org/GLM-5.2-FP8 \
  --port 8000 \
  --tensor-parallel-size 8 \
  --kv-cache-dtype fp8 \
  --max-model-len 180000 \
  --async-scheduling \
  --reasoning-parser glm45 \
  --tool-call-parser glm47 \
  --enable-auto-tool-choice \
  --override-generation-config '{"max_new_tokens": 16384}' \
  --trust-remote-code
```

{% endtab %}

{% tab title="Kubernetes" %}

#### <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fltwyft3JLUiTn7mmPqae%2Fkubernetes%20logo.png?alt=media&#x26;token=eb7900fc-82f5-4711-8755-c9cc4d895c97" alt="" data-size="line">

#### 1. Namespace Creation

```bash
kubectl create namespace llm-inference
```

#### 2. Deployment Manifest — Optimized for 8xH200

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: glm-5-2-vllm
  namespace: llm-inference
spec:
  replicas: 1
  selector:
    matchLabels:
      app: glm-5-2-vllm
  template:
    metadata:
      labels:
        app: glm-5-2-vllm
    spec:
      containers:
        - name: vllm-container
          image: vllm/vllm-openai:v0.23.0
          args:
            - "--model"
            - "zai-org/GLM-5.2-FP8"
            - "--served-model-name"
            - "zai-org/GLM-5.2-FP8"
            - "--port"
            - "8000"
            - "--tensor-parallel-size"
            - "8"
            - "--kv-cache-dtype"
            - "fp8"
            - "--max-model-len"
            - "180000"
            - "--async-scheduling"
            - "--reasoning-parser"
            - "glm45"
            - "--tool-call-parser"
            - "glm47"
            - "--enable-auto-tool-choice"
            - "--override-generation-config"
            - '{"max_new_tokens": 16384}'
            - "--trust-remote-code"
          ports:
            - containerPort: 8000
          env:
            - name: HF_HOME
              value: "/hf_cache"
            - name: SAFETENSORS_FAST_GPU
              value: "1"
            - name: VLLM_SERVER_DEV_MODE
              value: "1"
          resources:
            limits:
              nvidia.com/gpu: 8
          volumeMounts:
            - name: cache-volume
              mountPath: /hf_cache
            - name: dshm
              mountPath: /dev/shm
      volumes:
        - name: cache-volume
          emptyDir: {}
        - name: dshm
          emptyDir:
            medium: Memory
            sizeLimit: "32Gi"
```

#### 3. Service Manifest

```yaml
apiVersion: v1
kind: Service
metadata:
  name: glm-5-2-service
  namespace: llm-inference
spec:
  selector:
    app: glm-5-2-vllm
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8000
```

#### 4. Verification Commands

```bash
kubectl logs -f deployment/glm-5-2-vllm -n llm-inference
kubectl get pods,svc -n llm-inference
```

In-cluster endpoint: `http://glm-5-2-service.llm-inference.svc.cluster.local/v1`.
{% endtab %}
{% endtabs %}

#### MiniMax-M2.5

{% tabs %}
{% tab title="Standalone Docker" %} <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fr7yJ4dKMqczlIfYY4n8G%2Fdocker%20logo.png?alt=media&#x26;token=99583e26-1e5a-4efb-90b0-f59103d53b08" alt="" data-size="line"> **Automated Startup Script:**

```bash
#!/bin/bash
set -e

# 1. Install Docker
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl gnupg software-properties-common
curl -fsSL https://get.docker.com | sudo sh

# 2. Install NVIDIA Container Toolkit (required for --gpus all)
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
  | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -fsSL https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
  | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \
  | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

# 3. Persistent HF cache
sudo mkdir -p /home/ubuntu/data

# 4. Launch vLLM container (Optimized for 2xB200)
sudo docker run -d --gpus all \
  --name minimax-m2-5-vllm \
  -p 0.0.0.0:8000:8000 \
  -v /home/ubuntu/data:/hf_cache \
  -e HF_HOME=/hf_cache \
  -e VLLM_ATTENTION_BACKEND=FLASHINFER \
  -e VLLM_FLASHINFER_MOE_BACKEND=throughput \
  -e VLLM_USE_FLASHINFER_MOE_FP16=1 \
  -e VLLM_USE_FLASHINFER_MOE_FP8=1 \
  -e VLLM_USE_FLASHINFER_MOE_FP4=1 \
  -e VLLM_USE_FLASHINFER_MOE_MXFP4_MXFP8=1 \
  -e SAFETENSORS_FAST_GPU=1 \
  -e VLLM_SERVER_DEV_MODE=1 \
  -e TORCH_ALLOW_TF32_CUBLAS_OVERRIDE=1 \
  vllm/vllm-openai:v0.14.0 \
  MiniMaxAI/MiniMax-M2.5 \
  --served-model-name MiniMaxAI/MiniMax-M2.5 \
  --port 8000 \
  --max-model-len 180000 \
  --max-num-seqs 56 \
  --tool-call-parser minimax_m2 \
  --reasoning-parser minimax_m2 \
  --enable-auto-tool-choice \
  --tensor-parallel-size 2 \
  --gpu-memory-utilization 0.9 \
  --swap-space 16 \
  --enable-expert-parallel \
  --trust_remote_code
```

{% endtab %}

{% tab title="Kubernetes" %}
![](https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fltwyft3JLUiTn7mmPqae%2Fkubernetes%20logo.png?alt=media\&token=eb7900fc-82f5-4711-8755-c9cc4d895c97)

**1. Namespace Creation**

```bash
kubectl create namespace llm-inference
```

**2. Deployment Manifest**

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: minimax-m2-5-vllm
  namespace: llm-inference
spec:
  replicas: 1
  selector:
    matchLabels:
      app: minimax-m2-5-vllm
  template:
    metadata:
      labels:
        app: minimax-m2-5-vllm
    spec:
      containers:
        - name: vllm-container
          image: vllm/vllm-openai:v0.14.0
          args:
            - "MiniMaxAI/MiniMax-M2.5"
            - "--served-model-name"
            - "MiniMaxAI/MiniMax-M2.5"
            - "--port"
            - "8000"
            - "--max-model-len"
            - "180000"
            - "--max-num-seqs"
            - "56"
            - "--tool-call-parser"
            - "minimax_m2"
            - "--reasoning-parser"
            - "minimax_m2"
            - "--enable-auto-tool-choice"
            - "--tensor-parallel-size"
            - "2"
            - "--gpu-memory-utilization"
            - "0.9"
            - "--swap-space"
            - "16"
            - "--enable-expert-parallel"
            - "--trust_remote_code"
          ports:
            - containerPort: 8000
          env:
            - name: HF_HOME
              value: "/hf_cache"
            - name: VLLM_ATTENTION_BACKEND
              value: "FLASHINFER"
            - name: VLLM_FLASHINFER_MOE_BACKEND
              value: "throughput"
            - name: VLLM_USE_FLASHINFER_MOE_FP16
              value: "1"
            - name: VLLM_USE_FLASHINFER_MOE_FP8
              value: "1"
            - name: VLLM_USE_FLASHINFER_MOE_FP4
              value: "1"
            - name: VLLM_USE_FLASHINFER_MOE_MXFP4_MXFP8
              value: "1"
            - name: SAFETENSORS_FAST_GPU
              value: "1"
            - name: VLLM_SERVER_DEV_MODE
              value: "1"
            - name: TORCH_ALLOW_TF32_CUBLAS_OVERRIDE
              value: "1"
          resources:
            limits:
              nvidia.com/gpu: 2
          volumeMounts:
            - name: cache-volume
              mountPath: /hf_cache
            - name: dshm
              mountPath: /dev/shm
      volumes:
        - name: cache-volume
          emptyDir: {}
        - name: dshm
          emptyDir:
            medium: Memory
            sizeLimit: "16Gi"
```

**Service Manifest**

```yaml
apiVersion: v1
kind: Service
metadata:
  name: minimax-m2-5-service
  namespace: llm-inference
spec:
  selector:
    app: minimax-m2-5-vllm
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8000
```

***

**Verification Commands**

```bash
kubectl logs -f deployment/minimax-m2-5-vllm -n llm-inference
kubectl get pods,svc -n llm-inference
```

{% endtab %}
{% endtabs %}

#### Qwen/Qwen3.8-27B

{% tabs %}
{% tab title="Standalone Docker" %}
![](https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fr7yJ4dKMqczlIfYY4n8G%2Fdocker%20logo.png?alt=media\&token=99583e26-1e5a-4efb-90b0-f59103d53b08)

**Execution Script:**

```bash
#!/bin/bash
set -e

# 1. Install Docker
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl gnupg software-properties-common
curl -fsSL https://get.docker.com | sudo sh

# 2. Install NVIDIA Container Toolkit (required for --gpus all)
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
  | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -fsSL https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
  | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \
  | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update && sudo apt-get install -y --allow-change-held-packages \
  nvidia-container-toolkit nvidia-container-toolkit-base \
  libnvidia-container-tools libnvidia-container1
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

# 3. Persistent HF cache
sudo mkdir -p /home/ubuntu/data

# 4. Launch vLLM container (Optimized for 4xB200)
sudo docker run -d --gpus all \
  --name qwen3-8-27b-vllm \
  -p 0.0.0.0:8000:8000 \
  -v /home/ubuntu/data:/hf_cache \
  -e HF_HOME=/hf_cache \
  -e SAFETENSORS_FAST_GPU=1 \
  -e VLLM_SERVER_DEV_MODE=1 \
  -e TORCH_ALLOW_TF32_CUBLAS_OVERRIDE=1 \
  -e VLLM_ALLOW_LONG_MAX_MODEL_LEN=1 \
  vllm/vllm-openai:v0.22.0 \
  --model Qwen/Qwen3.8-27B-FP8 \
  --served-model-name Qwen/Qwen3.8-27B-FP8 \
  --port 8000 \
  --tensor-parallel-size 4 \
  --reasoning-parser qwen3 \
  --tool-call-parser qwen3_xml \
  --enable-auto-tool-choice \
  --max-model-len 262144 \
  --max-num-seqs 128 \
  --max-num-batched-tokens 16384 \
  --gpu-memory-utilization 0.95 \
  --kv-cache-dtype fp8 \
  --enable-prefix-caching \
  --async-scheduling \
  --trust-remote-code
```

{% endtab %}

{% tab title="Kubernetes" %} <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fltwyft3JLUiTn7mmPqae%2Fkubernetes%20logo.png?alt=media&amp;token=eb7900fc-82f5-4711-8755-c9cc4d895c97" alt="" data-size="line">

#### 1. Namespace Creation

```bash
kubectl create namespace llm-inference
```

#### 2. Deployment Manifest — Optimized for 4×B200

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: qwen3-8-27b-vllm
  namespace: llm-inference
spec:
  replicas: 1
  selector:
    matchLabels:
      app: qwen3-8-27b-vllm
  template:
    metadata:
      labels:
        app: qwen3-8-27b-vllm
    spec:
      containers:
        - name: vllm-container
          image: vllm/vllm-openai:v0.22.0
          args:
            - "--model"
            - "Qwen/Qwen3.8-27B-FP8"
            - "--served-model-name"
            - "Qwen/Qwen3.8-27B-FP8"
            - "--port"
            - "8000"
            - "--tensor-parallel-size"
            - "4"
            - "--reasoning-parser"
            - "qwen3"
            - "--tool-call-parser"
            - "qwen3_xml"
            - "--enable-auto-tool-choice"
            - "--max-model-len"
            - "262144"
            - "--max-num-seqs"
            - "128"
            - "--max-num-batched-tokens"
            - "16384"
            - "--gpu-memory-utilization"
            - "0.95"
            - "--kv-cache-dtype"
            - "fp8"
            - "--enable-prefix-caching"
            - "--async-scheduling"
            - "--trust-remote-code"
          ports:
            - containerPort: 8000
          env:
            - name: HF_HOME
              value: "/hf_cache"
            - name: SAFETENSORS_FAST_GPU
              value: "1"
            - name: VLLM_SERVER_DEV_MODE
              value: "1"
            - name: TORCH_ALLOW_TF32_CUBLAS_OVERRIDE
              value: "1"
            - name: VLLM_ALLOW_LONG_MAX_MODEL_LEN
              value: "1"
          resources:
            limits:
              nvidia.com/gpu: 4
          volumeMounts:
            - name: cache-volume
              mountPath: /hf_cache
            - name: dshm
              mountPath: /dev/shm
      volumes:
        - name: cache-volume
          emptyDir: {}
        - name: dshm
          emptyDir:
            medium: Memory
            sizeLimit: "16Gi"
```

#### 3. Service Manifest

```yaml
apiVersion: v1
kind: Service
metadata:
  name: qwen3-8-27b-service
  namespace: llm-inference
spec:
  selector:
    app: qwen3-8-27b-vllm
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8000
```

#### 4. Verification Commands

```bash
kubectl logs -f deployment/qwen3-8-27b-vllm -n llm-inference
kubectl get pods,svc -n llm-inference
```

**In-cluster endpoint:** `http://qwen3-8-27b-service.llm-inference.svc.cluster.local/v1`
{% endtab %}
{% endtabs %}


# Additional Requirements & Features

Tabnine AI code assistant: System requirements

### Provenance and Attribution:

Storage: 5 TB available space

### **Domain Name System (DNS)**

DNS configured with an A or CNAME record for the load balancer where the application\
will be exposed.

### **TLS Certificate**

TLS certificate and private key issued and signed by a certificate authority that you trust (key and certificate in PEM format).

### **Network Connection**

* Connection to Tabnine container registry:
  * Host: registry.tabnine.com
  * IP: 34.72.243.185
  * Port: 443
* Connection to Tabnine logs gateway for collecting metrics and logs (optional):
  * Host: logs-gateway.tabnine.com
  * IP: 34.123.33.186
  * Port: 443

### **Databases**

<table><thead><tr><th width="57.7890625"></th><th>Databases</th></tr></thead><tbody><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-7aabb0dd08a6560efc2b4fe308c2b2acf25ee438%2FRedis.svg?alt=media" alt=""></td><td>Redis version 8.0+</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-4656cb79adde771d6eb3bf58647f4e82e89e083b%2FPostgresSQL.svg?alt=media" alt=""></td><td>PostgreSQL version 18.0+</td></tr></tbody></table>

***

### Kubernetes

{% tabs %}
{% tab title="On-Premises Kubernetes" %}
**On-Premises Kubernetes** ​Tabnine Enterprise can be installed on a new or existing Kubernetes cluster. For customers installing on a brand new Kubernetes cluster, we recommend the following minimum hardware specifications for the Kubernetes control-plane only (non-inclusive of Tabnine requirements).

| **Specs (Per Node)** | **HA**         | **Non-HA**     |
| -------------------- | -------------- | -------------- |
| Number of Nodes      | 3              | 1              |
| CPU                  | 4 CPU          | 4 CPU          |
| Memory               | 16 GB          | 16 GB          |
| Disk                 | 256 GB SSD     | 256 GB SSD     |
| Network              | 1 GbE          | 1 GbE          |
| Operating System     | RHEL or Ubuntu | RHEL or Ubuntu |

**On-Premises**

| **Specs (Minimum)** | **1 - 200 Users** | **201 - 500 Users** | **501-1000 Users** | **1001-2000 Users** | **2000+ Users** |
| ------------------- | ----------------- | ------------------- | ------------------ | ------------------- | --------------- |
| CPU                 | 64                | 64                  | 72                 | 72                  | 96              |
| Memory              | 144 GB            | 144 GB              | 192 GB             | 192 GB              | 256 GB          |
| Disk                | 10 TB SSD         | 10 TB SSD           | 16 TB SSD          | 16 TB SSD           | 32 TB SSD       |
| {% endtab %}        |                   |                     |                    |                     |                 |

{% tab title="On-Prem Hybrid Kubernetes" %}
On-Prem Hybrid allows for a connection to external models for the main LLM, including Claude Sonnet, ChatGPT, Gemini, etc.

| **Specs (Per Node)** | **HA**         | **Non-HA**     |
| -------------------- | -------------- | -------------- |
| Number of Nodes      | 3              | 1              |
| CPU                  | 4 CPU          | 4 CPU          |
| Memory               | 16 GB          | 16 GB          |
| Disk                 | 256 GB SSD     | 256 GB SSD     |
| Network              | 1 GbE          | 1 GbE          |
| Operating System     | RHEL or Ubuntu | RHEL or Ubuntu |

**On-Premises Hybrid**

| **Specs (Minimum)** | **1 - 200 Users** | **201 - 500 Users** | **501-1000 Users** | **1001-2000 Users** | **2000+ Users** |
| ------------------- | ----------------- | ------------------- | ------------------ | ------------------- | --------------- |
| CPU                 | 64                | 64                  | 72                 | 72                  | 96              |
| Memory              | 144 GB            | 144 GB              | 192 GB             | 192 GB              | 256 GB          |
| Disk                | 10 TB SSD         | 10 TB SSD           | 16 TB SSD          | 16 TB SSD           | 32 TB SSD       |
| GPUs                | 2 x H100          | 2 x H100            | 4 x H100           | 6 x H100            | 10 x H100       |

<br>
{% endtab %}
{% endtabs %}


# Supported Languages

Tabnine AI code assistant: Supported languages

Tabnine is an AI software development platform with architectural freedom and model flexibility.

The majority of our key capabilities come from chat and agents powered by third-party models.

The LLMs we use cover 600+ languages, libraries, and frameworks.

Customers with private installations can connect and fine-tune their own models.


# Supported IDEs

Tabnine AI code assistant: Supported IDEs

## **Tabnine fully supports the following IDEs:**

<table><thead><tr><th width="63.7255859375"></th><th width="130">IDE</th><th>Minimal supported version</th><th>Latest supported version</th><th data-type="checkbox">Windows OS</th><th data-type="checkbox">Mac OS</th><th data-type="checkbox">Linux OS</th></tr></thead><tbody><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-b9a5693a952ab698fae8b49fa5dde2c27cc1b83a%2FVisual%20Studio%20Code%20(VS%20Code).svg?alt=media" alt="" data-size="original"></td><td>VS Code</td><td>1.93.1</td><td>1.129.0</td><td>true</td><td>true</td><td>true</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-74716d5d81d7c0b8ecb601c7d0ac00a6bda75c6b%2FJetBrains.png?alt=media" alt="" data-size="original"></td><td>JetBrains IDEs</td><td>2023.3</td><td>2026.2</td><td>true</td><td>true</td><td>true</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-d8b6b66314cf445674a0cbcce3e803f082b76000%2FEclipse%20IDE.png?alt=media" alt="" data-size="original"></td><td>Eclipse</td><td>4.28 (2023-06)</td><td>4.40 (2026-06)</td><td>true</td><td>true</td><td>true</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-ea81a5ec9acf7fe845aa25f6754cf1a1a852b9e9%2FVisual_Studio_Icon_2019.svg.png?alt=media" alt="" data-size="original"></td><td>Visual Studio 2022</td><td>17.8</td><td>17.14</td><td>true</td><td>false</td><td>false</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FnAs1fEuLCy9uwHFbqPXC%2FVs2026_logo.png?alt=media&amp;token=a45e1da6-d62a-4139-a3e4-d9b985c3d090" alt=""></td><td>Visual Studio 2026</td><td>18.1</td><td>18.7</td><td>true</td><td>false</td><td>false</td></tr></tbody></table>

#### Tabnine's support for JetBrains IDEs includes:

Tabnine supports **JetBrains IDEs built on the IntelliJ Platform**. This list is **representative**, not a complete list of every JetBrains product.

<table data-header-hidden><thead><tr><th width="66.5654296875">Tabnine's support for JetBrains IDEs includes:</th><th></th></tr></thead><tbody><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-5c5cc41a7ab010d3008c633811cc3c426a04c5b6%2FIntelliJ_IDEA_Icon.svg.png?alt=media" alt=""></td><td>IntelliJ IDEA</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-341a68aa0a4b511f4be644f6e90e3b49728729e4%2FPyCharm_icon.svg?alt=media" alt="" data-size="original"></td><td>PyCharm</td></tr><tr><td><picture><source srcset="/files/hNTkdouL2wZ0RCOd1w0A" media="(prefers-color-scheme: dark)"><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FnrKh9CRdg6dteE5rb9XG%2FWebStorm_Icon.svg.png?alt=media&amp;token=cd51bff0-9b31-4ed9-bef2-9534a88f4849" alt="" data-size="original"></picture></td><td>WebStorm</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-d5780cfadae8e6549a93052bf666a08137f13710%2FPhpStorm_icon.svg?alt=media" alt="" data-size="original"></td><td>PhpStorm</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-6b25f0e18f47a641bb293e2139652967bc293fef%2Fandroid%20studio.png?alt=media" alt="" data-size="original"></td><td>Android Studio</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-b1d11ba3dc79b95bf941fec7c6f6671f20524a0d%2FGoLand.png?alt=media" alt="" data-size="original"></td><td>GoLand</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-ebc929863c0316ebc8f49140e0fec9f56a2e38b4%2FCLion.png?alt=media" alt="" data-size="original"></td><td>CLion</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-c53c4155bf5212ca6bd98cbbcaffb7a107902736%2Frider.png?alt=media" alt="" data-size="original"></td><td>Rider</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-08fc96b07466bbaa660dfc77c23fad933e7e9e85%2Fdatagrip.png?alt=media" alt="" data-size="original"></td><td>DataGrip</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-26449352fdd497c0f52dbf839f95b50dca5e2b59%2Fcom.jetbrains.RustRover.png?alt=media" alt="" data-size="original"></td><td>RustRover</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-15d0482114ccae96eadf76a53a4065c2927fe0d8%2Frm.webp?alt=media" alt="" data-size="original"></td><td>RubyMine</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-0bd94acfe54db81a109ce5bacf28f23226fd9b80%2Fdataspell.png?alt=media" alt="" data-size="original"></td><td>DataSpell</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-01ab0d5f045786f4c0c40e1b73511c820c479d73%2FAqua.png?alt=media" alt="" data-size="original"></td><td>Aqua</td></tr></tbody></table>

{% hint style="info" %}
If you're using **IntelliJ IDEA**, you're covered too. It's an IntelliJ Platform IDE and uses the same Tabnine JetBrains plugin.
{% endhint %}

{% hint style="info" %}
Tabnine plugins for other IDEs are either:

* Legacy plugins that don't support the advanced completions or the Tabnine Chat
* Unofficial community plugins
  {% endhint %}


# Tabnine Subscription Plans


# Enterprise (SaaS)

Tabnine AI code assistant: Enterprise subscription

{% hint style="info" %}
**Important note for Tabnine Enterprise customers:**

**Tabnine Enterprise (SaaS)** is aimed at customers with **a secure SaaS setup**.

If you're a Tabnine Enterprise customer with a **private installation** (VPC or on-premises), [visit this page](/main/welcome/readme/tabnine-subscription-plans/enterprise-private-installation)**.**

Interested in learning more about Tabnine Enterprise? [**Explore Tabnine's plans**](https://www.tabnine.com/pricing) or [**contact Sales**](https://www.tabnine.com/?expert\&utm_source=docs\&utm_medium=organic\&utm_campaign=docs)**.**
{% endhint %}

## About Tabnine Enterprise <a href="#about-tabnine-enterprise" id="about-tabnine-enterprise"></a>

Tabnine Enterprise (for all types of installations) has been built to help software engineering teams write high-quality code faster and more efficiently, accelerating the entire software development life cycle (SDLC).

With Tabnine Enterprise, developers can benefit from contextual code suggestions that boost productivity by streamlining repetitive coding tasks and producing high-quality, industry-standard code.

Tabnine’s code suggestions are based on large language models that are exclusively trained on credible open source code with permissive licensing.

Moreover, with Tabnine Enterprise, developers have the flexibility to run the model on-premises or in a VPC, ensuring full control over their data and infrastructure while leveraging the power of Tabnine to comply with enterprise data security policies.

### About Tabnine Enterprise (SaaS)

Tabnine Enterprise customers have the option of using our secure SaaS deployment, which offers full access to our enterprise features on a cloud platform built with robust security, reliability, compliance, and resilience, adhering to industry best practices.

Learn more about [Tabnine Enterprise (SaaS) server architecture](/main/welcome/readme/architecture).

### Getting started with Tabnine Enterprise (SaaS)

{% hint style="info" %}
Tabnine Enterprise (SaaS) accounts can only be set up together with the Tabnine team.

Interested in learning more about Tabnine Enterprise? [Explore Tabnine's plans](https://www.tabnine.com/pricing) or [**contact Sales**](https://www.tabnine.com/?expert\&utm_source=docs\&utm_medium=organic\&utm_campaign=docs).
{% endhint %}

Here's how to get Tabnine Enterprise (SaaS) up and running:

1. The [team admin](broken://pages/IOxQk6pVYvqvjkKcaHmS) should [set up a Tabnine Enterprise (SaaS) account](broken://pages/aVxqvbKVWsBblPL7z7qE).
2. The team admin can then [invite the team members](broken://pages/pYTETvXgC2y6GQZTE7YI).
3. After team members join the team, they can:
   1. [Set up and activate the Tabnine plugin](broken://pages/VomGbxMlfdcHawbFg1z4).
   2. Start [working with Tabnine](/main/getting-started/quickstart).
4. The team admin can then [monitor and manage the team](broken://pages/AcE437xJoN1T1W432vIR).

Learn more about the [team admin](broken://pages/IOxQk6pVYvqvjkKcaHmS).

### Code privacy

With Tabnine Enterprise (SaaS):

* Your code remains private: Tabnine *never* stores your code.
* Tabnine doesn't share any of your code with third parties.
* Tabnine doesn't train on your code (unless you specifically opt for a private custom model for your team).
* Tabnine models only train on open source code with permissive licenses.

Learn more about [Tabnine's code privacy](https://www.tabnine.com/code-privacy).

### **Compliance**

* [SOC2 compliant](https://trust.tabnine.com/)
* [GDPR compliant](https://trust.tabnine.com/)


# Enterprise (private installation)

## About Tabnine Enterprise <a href="#about-tabnine-enterprise" id="about-tabnine-enterprise"></a>

Tabnine Enterprise has been built to help software engineering teams write high-quality code faster and more efficiently, accelerating the entire software development life cycle (SDLC).

By using Tabnine Enterprise, developers can benefit from contextual code suggestions that boost productivity by streamlining repetitive coding tasks and producing high-quality, industry-standard code.

Tabnine’s code suggestions are based on large language models that are exclusively trained on credible open source code with permissive licensing.

Moreover, with Tabnine Enterprise, developers have the flexibility to run the model on-premises or in a VPC, ensuring full control over their data and infrastructure while leveraging the power of Tabnine to comply with enterprise data security policies.

## Getting started <a href="#getting-started" id="getting-started"></a>

You can deploy and host the Tabnine Enterprise Server in your data center or a supported cloud provider.

Before you begin, you should review the [system requirements](/main/welcome/readme/system-requirements#tabnine-cluster) for running Tabnine Enterprise.

You can also review different architecture and [deployment options](/main/welcome/readme/architecture/deployment-options) in the [Tabnine Enterprise Server Overview and Architecture](/main/welcome/readme/architecture) section.

To get started with the Tabnine Enterprise server, follow these steps:

1\. [Install the Tabnine Enterprise Server](https://github.com/codota/docs/blob/main/main/welcome/readme/tabnine-subscription-plans/broken-reference/README.md).

2\. [Manage and organize your teams](/main/administering-tabnine/managing-your-team).


# Support & Feedback

Tabnine AI code assistant support and feedback

## Community support

* Tabnine [FAQ](https://support.tabnine.com/hc/en-us)
* Read or create issues in our GitHub repos:
  * [Tabnine](https://github.com/codota/TabNine/issues)
  * [VS Code extension](https://github.com/codota/tabnine-vscode/issues)
  * [JetBrains plugin](https://github.com/codota/tabnine-intellij/issues)

## Official support

If you're experiencing an issue and can't find a solution in the FAQ or GitHub repos, you can open a support ticket by emailing <support@tabnine.com> with as much information as you can provide (describe the issue, add log files, screenshots/videos, etc.).

**Pro**

* Monday–Friday
* Expect a response within 3 business days

**Enterprise**

* Be sure to include the severity of the issue (e.g., urgent, high, normal, low) in the subject and body of the ticket (email).
* Our standard terms for availability and SLAs are listed below. Additionally, we also offer enterprise customers the option to have stronger terms for availability and SLAs. Please contact us if you need custom terms for availability and SLAs.

Enterprise Service

| Severity level for production systems only | Criteria                                                                                                                                                                                                                                                                            |
| ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p>Severity 1</p><p>(Urgent)</p>           | <p>Fatal:</p><ul><li>All or majority of Customer end users are unable to work with Tabnine.</li><li>Critical severity security-related issue.</li></ul><p><br></p>                                                                                                                  |
| <p>Severity 2</p><p>(High)</p><p><br></p>  | Severe Impact: Issue disabling major functions of the Software service from being performed. This condition exists when the Software service is partially inoperative but is still usable by the Customer or an essential part of the Software service is unusable due to a defect. |
| <p>Severity 3</p><p>(Normal)</p>           | Degraded Operations: The Customer's use of the Software service is somewhat compromised, but all essential parts can be used.                                                                                                                                                       |
| <p>Severity 4</p><p>(Low)</p>              | Minimal Impact: Includes all other Issues or other inquiries. This condition generally exists when the Software service is usable, and the problems consist of inconveniences, deviation from Documentation, or minor failures involving individual system components.              |

All categories above apply only to Issues within the control of Tabnine or its hosting partners.

Upon receipt of a service ticket and initially classifying the Severity of the reported issue, Tabnine shall use commercially reasonable efforts to promptly contact the Customer to confirm the Severity level of the Software service call and shall use commercially reasonable efforts to respond to the reported Issue and service calls according to the following schedule:

| Severity level                   | Initial Response time                    |
| -------------------------------- | ---------------------------------------- |
| Severity 1 (Urgent)              | 2 hours (8X5, CET, Monday-Friday)        |
| <p>Severity 2</p><p>(High)</p>   | 4 hours (8X5, CET, Monday-Friday)        |
| <p>Severity 3</p><p>(Normal)</p> | 12 hours (8X5, CET, Monday-Friday)       |
| <p>Severity 4</p><p>(Low)</p>    | 3 business days (8X5 CET, Monday-Friday) |

\\

***

## Feedback

Share your feedback by emailing <feedback@tabnine.com>.


# Install

Tabnine AI code assistant: Client installation guide

## Install and activate the Tabnine plugin

Follow these steps to install and activate the Tabnine plugin in your IDE:

1. **Sign up** or **join** a Tabnine team.
2. **Install Tabnine on your IDE** (activate the plugin with your Tabnine user).
3. Follow the [**Quickstart Guide**](/main/getting-started/quickstart) and start using Tabnine.

{% hint style="info" %}
**Follow the right docs**

The installation process is slightly different for a **Tabnine SaaS** and a **Tabnine private installation**.

We recommend following the Tabnine SaaS docs **unless you were told** by your team manager that your organization is using a private installation or **you know your organization's private Tabnine Server URL.**
{% endhint %}

### 1. Sign Up or Join a Tabnine Team

You can either sign up to create a new user or activate your user after receiving an invitation to join a Tabnine team.

**Sign Up**

If you're an individual developer or plan to start a Tabnine Pro team as an admin, [sign up ](https://app.tabnine.com/signup)and create a new user.

If you signed up using your work email, follow the link you receive at that address to verify your account.

**Join A Tabnine Team**

If you received an invitation to join a Tabnine team by email or by invitation link, you need to accept the invitation:

* [Join a Tabnine Enterprise Team (Private/Enterprise-SaaS)](/main/getting-started/install/client-setup-private-installation/join-your-team-private-installation)

Once you've accepted the invitation and joined your team on Tabnine, you need to install and activate the Tabnine plugin or extension in your IDE.

### **2. Install Tabnine On Your IDE**

**Note:** There's a difference between installing a Tabnine plugin for Tabnine SaaS (all Starter and Pro users, some Enterprise users) and a Tabnine plugin for private installation (some Enterprise customers).

{% hint style="info" %}
You can install the Tabnine plugin in multiple IDEs.
{% endhint %}

#### <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-d6a3275f1b33c468b61ce3faf912a0fc5a134a7b%2Fvsc.webp?alt=media" alt="" data-size="line"> Visual Studio Code

* [Visual Studio Code (Private/Enterprise-SaaS)](/main/getting-started/install/client-setup-private-installation/vs-code-private-installation)

#### <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-a31a6224620a0d3ee18eaab871f84dbf8f078618%2Fjb.webp?alt=media" alt="" data-size="line"> JetBrains IDEs (IntelliJ, PyCharm, WebStorm, PhpStorm, etc.)

* [JetBrains IDEs (Private/Enterprise-SaaS)](/main/getting-started/install/client-setup-private-installation/jetbrains-ides-private-installation)

#### <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-0920f6c4e65f036c6c903f4f4357aa6baf40aee1%2Fvs.webp?alt=media" alt="" data-size="line"> Visual Studio

* [Visual Studio 2022 & 2026 (Private/Enterprise-SaaS)](/main/getting-started/install/client-setup-private-installation/visual-studio-private-installation)

#### <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-dd5c75287f8ff150beba6ccb574e490613d88d2c%2Feclipse%20logo.webp?alt=media" alt="" data-size="line"> Eclipse

* [Eclipse (Private/Enterprise-SaaS)](/main/getting-started/install/client-setup-private-installation/eclipse-private-installation)

### 3. Verify that the Tabnine plugin is activated with your user

Once you've installed the Tabnine plugin, make sure it's correctly activated:

{% tabs %}
{% tab title="Verify on VS Code, JetBrains IDEs & Eclipse" %}
Look for **Tabnine** or **Tabnine Enterprise** on the status bar:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-8aca35d2ec02320449e7a7c209c5ae89dad7ada5%2FTabnine%20Icons.png?alt=media" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="VS22 & VS26" %}

1. In Visual Studio, go to **Extensions > Tabnine > Open Hub** and open **Tabnine Hub.**
2. Look for **Tabnine** or **Tabnine Enterprise** on the top left corner of the Tabnine Hub:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-8aca35d2ec02320449e7a7c209c5ae89dad7ada5%2FTabnine%20Icons.png?alt=media" alt=""><figcaption></figcaption></figure>
{% endtab %}
{% endtabs %}

You're all set and can now [start using Tabnine](/main/getting-started/quickstart)!


# Client Setup (Private/Enterprise-SaaS)

### Step 1. Join Your Team

First, you need to join your team’s Tabnine account either via the invitation link that was shared with you or the personal invitation that was sent to your work email by your team admin.

[Follow these instructions to join your Tabnine Enterprise team](/main/getting-started/install/client-setup-private-installation/join-your-team-private-installation).

### Step 2. Install the Tabnine plugin\*

Once you’ve joined your team, you need to install and configure Tabnine on your IDE. Here's how:

* Install the Tabnine extension/plugin for **Tabnine Enterprise** from the marketplace (VS Code or JetBrains).
* Set up the **Tabnine Enterprise Server URL.\*\***
* **Sign** **into Tabnine** within your IDE using your account credentials.

{% hint style="info" %}
\*See list of [supported IDEs and minimal versions](/main/welcome/readme/supported-ides).

\*\*For Enterprise SaaS users, your URL is <https://console.tabnine.com/>.
{% endhint %}

#### **Follow these links for detailed instructions on how to set up the Tabnine for Enterprise plugin**:

* ​[Install the Tabnine Enterprise extension in VS Code](/main/getting-started/install/client-setup-private-installation/vs-code-private-installation)​
* ​[Install the Tabnine Enterprise plugin in JetBrains](/main/getting-started/install/client-setup-private-installation/jetbrains-ides-private-installation)
* ​[Install the Tabnine Enterprise plugin in Eclipse](/main/getting-started/install/client-setup-private-installation/eclipse-private-installation)
* [Install the Tabnine Enterprise extension in Visual Studio 2022 or 2026​](/main/getting-started/install/client-setup-private-installation/visual-studio-private-installation)

### **Step 3:** [Start using Tabnine](/main/getting-started/quickstart)


# Sign In Using Authentication Token

### Sign in to the Tabnine plugin using an authentication token <a href="#sign-in-to-the-tabnine-plugin-using-an-authentication-token" id="sign-in-to-the-tabnine-plugin-using-an-authentication-token"></a>

For some IDE setups, it's not possible to activate the Tabnine plugin via the regular flow.

This includes setups such as Remote SSH, Docker, or WSL where the browser isn't available on the remote machine.

In these cases, you can activate the Tabnine plugin by signing in using an authentication token.

{% tabs %}
{% tab title="VS Code" %}

1. Open the **Command Pallet**
2. Run: **Tabnine: Sign in using auth token**

<figure><img src="https://open-2c.gitbook.com/url/preview/site_xstLD/~gitbook/image?url=https%3A%2F%2F3652871471-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F03uIXF1SrI5fdiuQqdFr%252Fuploads%252Fgit-blob-91ed4a84a36c6244040172d07b15e56e20c63a90%252Fimage.png%3Falt%3Dmedia&#x26;width=768&#x26;dpr=3&#x26;quality=100&#x26;sign=13676d9c&#x26;sv=2" alt=""><figcaption></figcaption></figure>

1. The following popup will appear:

<figure><img src="https://open-2c.gitbook.com/url/preview/site_xstLD/~gitbook/image?url=https%3A%2F%2F3652871471-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F03uIXF1SrI5fdiuQqdFr%252Fuploads%252Fgit-blob-87be237e7591d6f4e7671ffd2eacfcaff32959c1%252Fimage%2520%2817%29.png%3Falt%3Dmedia&#x26;width=768&#x26;dpr=3&#x26;quality=100&#x26;sign=cdc8eb77&#x26;sv=2" alt=""><figcaption></figcaption></figure>

1. If you already have an authentication token, click **Sign In** and skip to the relevant step below
2. If you don't already have a token, click **Get auth token**
3. The browser will open with the following [screen](https://app.tabnine.com/auth/sign-in/manual) for signing up, which includes a secret personal authentication token:

<figure><img src="https://open-2c.gitbook.com/url/preview/site_xstLD/~gitbook/image?url=https%3A%2F%2F3652871471-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F03uIXF1SrI5fdiuQqdFr%252Fuploads%252Fgit-blob-842c222e8d305877c38cffce3e1c4b65c9e308e0%252Fimage.png%3Falt%3Dmedia&#x26;width=768&#x26;dpr=3&#x26;quality=100&#x26;sign=adaed71c&#x26;sv=2" alt=""><figcaption></figcaption></figure>

1. Copy the token and go back to your IDE.
2. Paste your authentication token in the following popup and click **Enter**

<figure><img src="https://open-2c.gitbook.com/url/preview/site_xstLD/~gitbook/image?url=https%3A%2F%2Flh7-us.googleusercontent.com%2FYD9KAz4nlJYH8c5k1BCpQDqs-pnf-gqlJJv0MDZmnd8otSm7CvRZi32UaQxOF7wlWQZzv-G_XTUB7otAyqR7HRzPVwyVpgwHBsyoPEyspuWRPfV39ZlJ4s81sITxyes3Cqi1wRhPFkN3kiu5KwmVBgSAkw%3Ds2048&#x26;width=768&#x26;dpr=3&#x26;quality=100&#x26;sign=ed12f9ef&#x26;sv=2" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="JetBrains IDEs" %}

1. Click **double shift** do open the **Search Everywhere** window
2. Type **Tabnine: Sign in using auth token**

<figure><img src="https://open-2c.gitbook.com/url/preview/site_xstLD/~gitbook/image?url=https%3A%2F%2F3652871471-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F03uIXF1SrI5fdiuQqdFr%252Fuploads%252Fgit-blob-07c9da3c8118d0dc3442c02760d7e6c0cb22754e%252Fimage%2520%2822%29.png%3Falt%3Dmedia&#x26;width=768&#x26;dpr=3&#x26;quality=100&#x26;sign=abd8720&#x26;sv=2" alt=""><figcaption></figcaption></figure>

1. The following popup will appear

<figure><img src="https://open-2c.gitbook.com/url/preview/site_xstLD/~gitbook/image?url=https%3A%2F%2F3652871471-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F03uIXF1SrI5fdiuQqdFr%252Fuploads%252Fgit-blob-61bccc66b7f2df78859cc3ddb130c84dc87c4d92%252Fimage.png%3Falt%3Dmedia&#x26;width=768&#x26;dpr=3&#x26;quality=100&#x26;sign=c43efd77&#x26;sv=2" alt=""><figcaption></figcaption></figure>

1. If you already have an authentication token, click **Sign In** and skip to the relevant step below.
2. If you do not already have a token, click **Get auth token**
3. The browser will open with following [screen](https://app.tabnine.com/auth/sign-in/manual) (sign in if you are not), with a secret personal authentication token:

<figure><img src="https://open-2c.gitbook.com/url/preview/site_xstLD/~gitbook/image?url=https%3A%2F%2F3652871471-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F03uIXF1SrI5fdiuQqdFr%252Fuploads%252Fgit-blob-cac76885b4a0a3915e42d2ff3ef264de2294240f%252Fimage.png%3Falt%3Dmedia&#x26;width=768&#x26;dpr=3&#x26;quality=100&#x26;sign=118d36c3&#x26;sv=2" alt=""><figcaption></figcaption></figure>

1. Copy the token and go back to the IDE.
2. Paste your authentication token in the following popup and click **Enter**

<figure><img src="https://open-2c.gitbook.com/url/preview/site_xstLD/~gitbook/image?url=https%3A%2F%2F3652871471-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F03uIXF1SrI5fdiuQqdFr%252Fuploads%252Fgit-blob-62e11782b7b8b60afd9ea6c2a375deaad7e04de8%252Fimage.png%3Falt%3Dmedia&#x26;width=768&#x26;dpr=3&#x26;quality=100&#x26;sign=a8e76cbf&#x26;sv=2" alt=""><figcaption></figcaption></figure>
{% endtab %}
{% endtabs %}


# Join Your Team (Private/Enterprise-SaaS)

To join your team, you should have received an invitation to Tabnine from your team admin, either via email or a link.

If your organization has single sign-on (SSO), you'll see the following screen:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-4cd77c284020ff52e597ba49996e199e8a54eb9d%2FSSO%20sign%20in.png?alt=media" alt=""><figcaption></figcaption></figure>

Click **Sign In.**

{% hint style="info" %}
If your organization doesn't have SSO, you'll see the following screen:

<img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-1e907b26012c91a5dc68a526fe86d1f58ac286af%2FTabnine%20Sign%20Up.png?alt=media" alt="" data-size="original">

Enter your work email (it’s important to enter the correct work email with your organization’s domain), create your password, and click Sign Up.
{% endhint %}

You should now see the Welcome to Tabnine screen, which guides you through the process of installing Tabnine Enterprise in your IDE:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-2924da3368e10126665f64adf7e46061ec35fd6e%2Fjt3.webp?alt=media&amp;token=7b08f0d1-e206-4c8e-aa82-11fb78af2620" alt="" width="375"><figcaption></figcaption></figure>

You can also view instructions for these steps here:

* ​​[Install the Tabnine Enterprise extension in VS Code](/main/getting-started/install/client-setup-private-installation/vs-code-private-installation)
* [Install the Tabnine Enterprise plugin in JetBrains](/main/getting-started/install/client-setup-private-installation/jetbrains-ides-private-installation)
* [Install the Tabnine Enterprise extension in Visual Studio 2022 or 2026​](/main/getting-started/install/client-setup-private-installation/visual-studio-private-installation)
* ​[Install the Tabnine Enterprise plugin in Eclipse](/main/getting-started/install/client-setup-private-installation/eclipse-private-installation)​


# Visual Studio Code (Private/Enterprise-SaaS)

Once you’ve joined your team’s Tabnine account, the next step is to install Tabnine from the VS Code Marketplace.

### Install from the VS Code Marketplace

1. In your VS Code IDE, go to **Extensions.**
2. Search for **Tabnine for Enterprise** and select.
3. Install the extension.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-cccff963f3a75414df54433eedd2f42b205070fa%2Fdl%20tabnine.png?alt=media" alt=""><figcaption></figcaption></figure>

### Configure the Tabnine Server URL

Once you restart the IDE and the extension is initialized, you’ll be prompted to set the URL of your Tabnine Enterprise Server.\
\
If you don’t have the URL, contact your Tabnine admin within your organization.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-7bfb5188c5bc2c5fad36836de73f126fd51747a5%2Fvsc2.webp?alt=media&amp;token=4cdf3c96-476e-4d2e-a86c-105d9d1ef8ea" alt="" width="375"><figcaption></figcaption></figure>

1. Once you reenter VSCode, you will be prompted to set up the Tabnine Server URL. Click **Set server URL** and enter the Tabnine server URL: [https://console.tabnine.com](https://console.tabnine.com/).

{% hint style="info" %}
If for some reason you are not prompted, you can set the server URL by going to **Manage** (⚙) in the bottom left-hand corner of your IDE. Select **Settings**.
{% endhint %}

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FCAotl61sj3shioBbgDJz%2Fimage.png?alt=media&amp;token=937c82f3-d5c6-4ac9-a690-9ababf1c5d72" alt=""><figcaption></figcaption></figure>

Once you update the URL, Tabnine will update itself to the latest version according to your organization's instance.

|                                                                                                                                                                                                                                                           |                                                                                                                                                                                                                                                           |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fe32qDpl78fXXHcRWHClV%2Fimage.png?alt=media&amp;token=aead519e-125b-4a3e-8832-9eea4de237fe" alt="" data-size="original"> | <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FM2UYcsMHXfVr8qoCMD0k%2Fimage.png?alt=media&amp;token=11601445-4ce7-412e-aac5-df8584623b49" alt="" data-size="original"> |

2. Click **Reload.**
3. When you see the following prompt, click **Sign in:**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-51c6f65157bde54ea00dbb593e9694b004cb7819%2Fvsc4.webp?alt=media&amp;token=8b5f8909-83a5-4bc0-8582-ec24deb3f2b5" alt="" width="375"><figcaption></figcaption></figure>

### Sign in to Tabnine

Next, a browser window will open and you'll be prompted to sign in to Tabnine. Click **Sign In:**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-4cd77c284020ff52e597ba49996e199e8a54eb9d%2FSSO%20sign%20in.png?alt=media" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
If your organization doesn't have SSO, you'll see the following screen. Sign in using your Tabnine user credentials:

<img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-1e907b26012c91a5dc68a526fe86d1f58ac286af%2FTabnine%20Sign%20Up.png?alt=media" alt="" data-size="original">
{% endhint %}

Once you’ve successfully signed in, you'll see the following message:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-52fd3aa5731f03c30d5b97e3d94cf0d82b05e0af%2FTabnine%20authenticated.png?alt=media" alt=""><figcaption></figcaption></figure>

Once you see this confirmation screen, close the browser, return to your IDE, and [start using Tabnine](/main/getting-started/quickstart)!


# JetBrains IDEs (Private/Enterprise-SaaS)

Once you’ve joined your team’s Tabnine account, the next step is to install Tabnine from the JetBrains Marketplace.

\
This article will guide you through onboarding using the Tabnine Enterprise plugin.

## Install from the JetBrains Marketplace <a href="#install-from-marketplace" id="install-from-marketplace"></a>

In your JetBrains IDE, go to S**ettings** > P**lugins** and install the `Tabnine Enterprise (Self-Hosted)` plugin from the JetBrains plugin marketplace:

1. In your JetBrains IDE, go to **Settings > Plugins.**
2. Search for **Tabnine Enterprise (Self-Hosted)** and select it (don't mix it with the other Tabnine extension).
3. Click **Install.**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FRA3Fgq8XFnxuCzHSvNXz%2Fimage.png?alt=media&amp;token=2afaf9a5-6022-49b0-89a9-2e289b63d301" alt=""><figcaption></figcaption></figure>

4. Once the plugin is installed, click **Restart IDE.**

## Install in an air-gapped environment <a href="#install-air-gapped" id="install-air-gapped"></a>

If your environment can't reach the public JetBrains Marketplace, install the plugin directly from your Tabnine Enterprise server by adding it as a custom plugin repository.

1. In your JetBrains IDE, go to **Settings > Plugins.**
2. Click the gear icon (⚙) at the top of the Plugins pane and select **Manage Plugin Repositories…**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-f7e2913340a3a360bc53403bafe77aae569f8076%2Fjb-manage-plugin-repositories.png?alt=media" alt=""><figcaption></figcaption></figure>

3. In the **Custom Plugin Repositories** dialog, click **+** and add the following URL, replacing `<YOUR TABNINE URL>` with your Tabnine Enterprise server URL. Then click **OK**.

```
https://<YOUR TABNINE URL>/update/jetbrains/updatePlugins.xml
```

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-34ba59c1e92131bed6142bf5c42696f22328c212%2Fjb-custom-plugin-repository.png?alt=media" alt=""><figcaption></figcaption></figure>

4. Back in **Settings > Plugins**, search for **Tabnine Enterprise (Self-Hosted)** and click **Install**. The plugin is now served from your Tabnine server instead of the public marketplace.
5. Once the plugin is installed, click **Restart IDE.**

## Configure the Tabnine Server URL

Once you restart the IDE and the plugin is initialized, you’ll be prompted to set the URL of your Tabnine Enterprise Server. If you don’t have the URL, contact your Tabnine admin within your organization.

Enter the URL and click **OK:**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-e525645d4ee2b7256d5db3d4d95b5aa8a884ef53%2Fjb3.webp?alt=media" alt="" width="375"><figcaption></figcaption></figure>

If for some reason you are not prompted, you can set the server URL by clicking on Settings (⚙), then select Settings in the dropdown menu.

Search for “Tabnine,” then navigate to **Tools** on the left-side menu. Select **Tabnine**.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FU2jg8szNTcTgnU9W9EC7%2Fimage.png?alt=media&amp;token=411e6aa5-8106-47be-aaba-0bbc3cb6b5a2" alt=""><figcaption></figcaption></figure>

In the settings, under Engine, type/paste your Tabnine Enterprise URL, [https://console.tabnine.com](https://console.tabnine.com/), in the adjacent bar. Then press <mark style="background-color:blue;">**OK**</mark>.

## Sign in to Tabnine

Next, navigate to the Tabnine prompt on the bottom menu in order to sign in.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FKLYoT6mCNLwuU1GhQjAx%2Funknown.png?alt=media&amp;token=a91fa7e0-3fbc-4622-8db0-d4e9915dc103" alt=""><figcaption></figcaption></figure>

1. Click the status bar and select **Sign in to Tabnine**:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2F5CCUznUlsdsYYssf5ytj%2Fimage.png?alt=media&amp;token=3bf29d38-7a43-45e2-8537-c0e14749c54f" alt=""><figcaption></figcaption></figure>

2. In the browser window that opens, click **Sign In:**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-4cd77c284020ff52e597ba49996e199e8a54eb9d%2FSSO%20sign%20in.png?alt=media" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
If your organization doesn't have SSO, you'll see the following screen. Sign in using your user credentials:

<img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-1e907b26012c91a5dc68a526fe86d1f58ac286af%2FTabnine%20Sign%20Up.png?alt=media" alt="" data-size="original">
{% endhint %}

Once you’ve successfully signed in, you'll see the following message:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-52fd3aa5731f03c30d5b97e3d94cf0d82b05e0af%2FTabnine%20authenticated.png?alt=media" alt=""><figcaption></figcaption></figure>

Once you see this confirmation screen, close the browser, return to your IDE, and [start using Tabnine](/main/getting-started/quickstart)!


# Visual Studio 2022 & 2026 (Private/Enterprise-SaaS)

Once you’ve joined your team’s Tabnine account, the next step is to install Tabnine Extension for Visual Studio 2022 or Visual Studio 2026.

### Install the Tabnine extension for Visual Studio 2022 <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-0920f6c4e65f036c6c903f4f4357aa6baf40aee1%2Fvs.webp?alt=media" alt="" data-size="line"> ***OR*** Visual Studio 2026 <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FnAs1fEuLCy9uwHFbqPXC%2FVs2026_logo.png?alt=media&amp;token=a45e1da6-d62a-4139-a3e4-d9b985c3d090" alt="" data-size="line">

1. Download the Tabnine extension for Visual Studio using the link in Tabnine's console:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FmazW8MGPGLVX6f54iBur%2FScreenshot%202025-12-09%20at%2011.33.39.png?alt=media&amp;token=895ae6dc-b417-4fbd-ac26-a895be59dac8" alt="Welcome to Tabnine starting screen"><figcaption></figcaption></figure>

2. Click on the downloaded file and run the installer.

You will need to close and reopen Visual Studio to add the Tabnine extension. After closing Visual Studio, open it normally. A VSIX Installer window will appear.

2. On the following screen, click <mark style="background-color:$info;">**Modify**</mark>:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-cf15cf5f8d7394342f3207dfa652a768da7cd77a%2FScreenshot%202025-03-03%20at%2014.03.12.png?alt=media" alt=""><figcaption></figcaption></figure>

Modifications may take a couple of minutes:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-24e5529cf9487c6c006b55c7c6aa41932da66289%2FScreenshot%202025-03-03%20at%2014.03.23.png?alt=media" alt=""><figcaption></figcaption></figure>

4. Once the extension is installed, you should see the following screen:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-f41fb5101dbbe57b74d600c7cc209a87526e8d9a%2FScreenshot%202025-03-03%20at%2014.05.36.png?alt=media" alt=""><figcaption></figcaption></figure>

You can elect to click <mark style="color:blue;">View Install Log</mark> if you wish. When you're finished, press <mark style="background-color:$info;">**Close**</mark>.

5. Restart your IDE.

### Configure the Tabnine Server URL

Once the IDE has been restarted and the extension is initialized, you’ll need to set the URL of your Tabnine Enterprise Server, by going to **Tools > Options > Tabnine** menu

If you don’t have the URL, contact your Tabnine admin within your organization.

1. Click **Open settings.**
2. Update **Server URL** settings with the **Tabnine Enterprise Server URL**
3. Restart your IDE.

### Sign in to Tabnine

Once you restart the IDE and the extension is initialized, you’ll be prompted to sign in to Tabnine. Click **sign-in.**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-5b0247d7d96b6543e5bd1b14d15de39ee3e283d8%2Fvs5.webp?alt=media" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
You can also sign in by opening the **Extensions > Tabnine Enterprise** menu.
{% endhint %}

Next, a browser window will open and you'll be prompted to log in to Tabnine. Click **Sign In:**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-4cd77c284020ff52e597ba49996e199e8a54eb9d%2FSSO%20sign%20in.png?alt=media" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
If your organization doesn't have SSO, you'll see the following screen. Sign in using your Tabnine user credentials:

<img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-1e907b26012c91a5dc68a526fe86d1f58ac286af%2FTabnine%20Sign%20Up.png?alt=media" alt="" data-size="original">
{% endhint %}

Once you’ve successfully signed in, you'll see the following message:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-c88bce24b996ea43eb3b3f72b4af04971b41c15a%2FScreenshot%202025-03-03%20at%2011.58.15.png?alt=media" alt=""><figcaption></figcaption></figure>

Once you see this confirmation screen, close the browser and return to your IDE. You should see the confirmation message:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-9b34bd3d1df1a006c3a40c61631c5296262993f6%2Fvs9.webp?alt=media" alt="" width="563"><figcaption></figcaption></figure>

Now [start using Tabnine](/main/getting-started/quickstart)!


# Eclipse (Private/Enterprise-SaaS)

Once you’ve joined your team’s Tabnine account, the next step is to install Tabnine in Eclipse.\
This article guides you through the process.

## Install from your private update site <a href="#install-from-marketplace" id="install-from-marketplace"></a>

1. In Eclipse, go to **Eclipse** > **Help** and select **Install New Software:**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-c5aa9bee4cc5e110751f9e4c80ecea400e3f2bc5%2Fec1.webp?alt=media" alt=""><figcaption></figcaption></figure>

2. Click **Add:**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-83641b80f2249baadf8ed4646ff877634d31151a%2Fec2.webp?alt=media" alt=""><figcaption></figcaption></figure>

3. In the **Add Repository** screen, add the details of your Tabnine Enterprise Server.
4. Enter the following URL for **Location:** https\://{YOUR TABNINE SERVER URL}/update/eclipse
5. Click **Add:**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-841dcb5dabc2de977a6896bf6eff73665a7bf53f%2Fec3.webp?alt=media" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Note:

If you have an internal certificate authority you will need to add:

1\. Locate the eclipse.ini file in your Eclipse installation and open it

2\. Below the line `-vmargs`, add the following lines, then save the file:

Mac OS:

**`-Djavax.net.ssl.trustStore=NUL`**

**`-Djavax.net.ssl.trustStoreType=KeychainStore`**

Windows:

**`-Djavax.net.ssl.trustStore=NUL`**

**`-Djavax.net.ssl.trustStoreType=Windows-ROOT`**

3\. Restart eclipse.
{% endhint %}

4. Select **Tabnine Eclipse Plugin** **- Self Hosted** and click **Next:**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-946cc1a5690438a735b8146d27fe9a1de6a7c852%2Fec4.webp?alt=media" alt=""><figcaption></figcaption></figure>

5. On the following screen, click **Next:**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-dcede4db11611176b1a9c01b2c737ffcd8042ea4%2Fec5.webp?alt=media" alt=""><figcaption></figcaption></figure>

6. Accept the terms and click **Finish:**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-177af5336248253240916b0c4ed47915c8908119%2Fec6.webp?alt=media" alt=""><figcaption></figcaption></figure>

7. Under **Authority / Update Site**, select your site and click **Trust Selected:**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-5c0077e850ae216ee05c532feb7fc1e789e39c1b%2Fec7.webp?alt=media" alt=""><figcaption></figcaption></figure>

8. You'll see that the installation is in progress:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-116de13f3bbe8209ddc4052fdde84c477d90dd37%2Fec8.webp?alt=media" alt=""><figcaption></figcaption></figure>

9. Once installation is complete, click **Restart Now** to restart your IDE:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-ffe92e2e933b7860764e9622d52845da3baed405%2Fec9.webp?alt=media" alt=""><figcaption></figcaption></figure>

### Configure the Tabnine Server URL

1. After your IDE restarts, you'll see the Tabnine logo on the status bar with a message requesting that you set the Tabnine Enterprise Server URL:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-ac1f51d48ea7f730aae8165bc200fee0eb02d1a2%2Fec10.webp?alt=media" alt=""><figcaption></figcaption></figure>

2. Click the status bar message, and then click <mark style="background-color:blue;">**Open settings**</mark>**:**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-4822301e96a0ad73079f34fbcce768b55066fa4d%2Fec11.webp?alt=media" alt=""><figcaption></figcaption></figure>

3. Set your Tabnine Enterprise Server URL to \[https\://{YOUR TABNINE SERVER URL}], click <mark style="background-color:blue;">**Apply and Close**</mark>**,** and restart your IDE:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-ebfc9c60930cb8ee6fbd9eacbcb8ab196838e746%2Fec12.webp?alt=media" alt=""><figcaption></figcaption></figure>

4. Wait for Tabnine Enterprise to initialize:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-462a88b255a937ef279732bc176edd1a37d3bd7e%2Fec13.webp?alt=media" alt=""><figcaption></figcaption></figure>

### Sign in to Tabnine

1. Tabnine will ask you to sign in. Click the message and then click **Login:**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-d643c39a23cf72242625328961cca3eeddca73fa%2Fec14.webp?alt=media" alt=""><figcaption></figcaption></figure>

2. A browser window will open and you'll be prompted to log in to Tabnine. Click **Sign In:**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-4cd77c284020ff52e597ba49996e199e8a54eb9d%2FSSO%20sign%20in.png?alt=media" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
If your organization doesn't have SSO, you'll see the following screen. Sign in using your Tabnine user credentials

<img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-1e907b26012c91a5dc68a526fe86d1f58ac286af%2FTabnine%20Sign%20Up.png?alt=media" alt="" data-size="original">
{% endhint %}

3. Once you’ve successfully signed in, you'll see the following message:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-52fd3aa5731f03c30d5b97e3d94cf0d82b05e0af%2FTabnine%20authenticated.png?alt=media" alt=""><figcaption></figcaption></figure>

Once you see this confirmation screen, close the browser and return to your IDE.

Now [start using Tabnine](/main/getting-started/quickstart)!


# Cursor (Private/Enterprise-SaaS)

Once you’ve joined your team’s Tabnine account, the next step is to install Tabnine from the Cursor Marketplace.

#### Install from the Cursor Marketplace

1. In your Cursor IDE, navigate to Cursor and go to Extensions to enter the [Cursor Marketplace](https://cursor.com/marketplace/tabnine/tabnine)
2. Search for **Tabnine for Enterprise** (not the legacy plugin) and select.
3. Hit the **Install** button.

<figure><img src="broken://files/jm4hd8OiJviUV30788dz" alt=""><figcaption></figcaption></figure>

#### Configure the Tabnine Server URL

Once you restart the IDE and the extension is initialized, you’ll be prompted to set the URL of your Tabnine Enterprise Server.\
\
If you don’t have the URL, contact your Tabnine admin within your organization.

Once you reenter Cursor, you will be prompted to set up the Tabnine Server URL.

<img src="broken://files/ESTpauxTEiCFFkIiUQSG" alt="" height="183" width="624">

Click **Set server URL** and enter the Tabnine server URL: [https://console.tabnine.com](https://console.tabnine.com/).

{% hint style="info" %}
If for some reason you are not prompted, you can set the server URL by going to Manage (⚙) in the bottom right-hand corner of your IDE. Select Settings.
{% endhint %}

Once you update the URL, Tabnine will update itself to the latest version according to your organization's instance.

1. Click **Reload**.
2. When you see the following prompt, click **Sign in**:

#### Sign in to Tabnine

Next, a browser window will open and you'll be prompted to sign in to Tabnine. Click Sign In:

{% hint style="info" %}
If your organization doesn't have SSO, you'll see the following screen. Sign in using your Tabnine user credentials:
{% endhint %}

Once you’ve successfully signed in, you'll see the following message:

<img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FMtdiCsnz9kNq3VUycOm2%2Funknown.png?alt=media&amp;token=c1cecdae-7313-4d32-a15f-1f4ac7224d22" alt="" height="280" width="544">

Once you see this confirmation screen, close the browser, return to your IDE, and [start using Tabnine](about:blank)!

<br>


# Quickstart Guide

Tabnine AI code assistant: Quickstart Guide

## Getting started with Tabnine

Tabnine provides **AI assistance** for software developers **directly in the IDE**, helping to streamline various daily software development tasks, including the following:

Tabnine helps developers be more productive and achieve these tasks by providing [code completions](/main/getting-started/code-completion) via the [Tabnine Chat](/main/getting-started/tabnine-chat) interface.

This guide covers:

* Installing the Tabnine plugin
* Getting started with code completions
* Getting started with Tabnine Chat
* Getting more out of Tabnine

## 1. Installing the Tabnine plugin

Make sure you've [installed and activated](/main/getting-started/install) the Tabnine plugin in your IDE.

## 2. Getting started with code completions

Tabnine's code completions help you write code faster.

As you code in your IDE, you’ll get AI-powered code suggestions based on your current context. The code completions adapt to your code as you type, and can offer code completions until the end of the line, for the next block of code, or full-function implementations.

#### Get started

Visit [Getting the most from Tabnine's code completions](/main/getting-started/code-completion#getting-started-with-code-completions) and learn:

* How to [get Tabnine's code suggestions](/main/getting-started/code-completion#get-tabnines-code-suggestions) as you code
* How to [accept a code suggestion](/main/getting-started/code-completion#accept-a-code-suggestion) (or partially accept it)

#### What to expect from Tabnine's code completions

Tabnine's code completion model was trained on real code. This means it works best when your current context looks like real code.

You can trigger comments-to-code completions with real code comments (i.e., documentation) instead of questions or instructions.

Tabnine helps you code faster and save extra typing, accelerating small, mundane coding tasks or reminding you of a specific syntax.

Tabnine code completions were *not designed* to help with high-level design or general questions about code, or to understand instructions. For these types of requests, use Tabnine Chat.

## 3. Getting started with Tabnine Chat

Tabnine Chat was designed to help developers perform various daily development tasks through a chat interaction interface, where the developer asks or instructs Tabnine regarding a code-related task.

#### Get started

* [Launch](/main/getting-started/tabnine-chat/launch) Tabnine Chat from within your IDE.
* Ask or instruct Tabnine Chat to perform a coding task using [natural language, built-in actions, or using CodeLens](/main/getting-started/tabnine-chat/interact).
* Tabnine Chat then returns an answer, which you can [review and apply to your code](/main/getting-started/tabnine-chat/consume).

## 4. Getting more out of Tabnine

Optimize your usage of Tabnine's AI by keeping it focused and following these best practices:

* Use detailed and specific [prompts](/main/getting-started/tabnine-chat/prompt).
* Use specific [context](/main/getting-started/tabnine-chat/chat-context/context-context-window).
* Use different [conversations](/main/getting-started/tabnine-chat/conversations) for different tasks and topics.
* Try a step-by-step approach to solving a larger problem.

**Didn't get the response you wanted?**

Here are some tips:

* Try asking a slightly different question or providing more detailed instructions.
* Make sure you've selected the relevant code before you ask a question.
* Consider opening a new conversation (with a fresh chat history).

#### What can I expect from Tabnine Chat?

The Tabnine Chat model was trained mainly on code with a small subset of English language text to support the chat interactions.

* **Ask questions about code:** Tabnine Chat was designed for code-related tasks; don't expect it to provide answers on general knowledge, emotions, etc.
* **Use English as the primary language:** The primary language of interaction with the chat is English. Tabnine Chat may be able to answer questions in other languages, but again, it was not designed for it and the answer may not be optimal.

Tabnine Chat was designed to help you achieve high-level tasks. However, don't expect to get the response you need in one click or one short instruction. Use Tabnine Chat in a step-by-step approach, where you collaborate with Tabnine's AI in iterations towards solving a larger problem.


# Menus and Icons

This page describes what some of the many icons indicate in Tabnine

This document will guide you through the various menus and submenus in Tabnine. At the end of this document, you can look at a chart of the most common and important icons that Tabnine uses.

### **Main Input Menu**

The main menu in the IDE plugin will show you tabs for Tabnine Agent, Chat, or Settings. To the right there will be an additional three-lined icon (the 'hamburger submenu') indicating more options.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-06242fadbea93698b4f4c1f41160e6a15b05bc02%2FMain%20Menu%20and%20Chat%20History.png?alt=media" alt=""><figcaption></figcaption></figure>

In that hamburger submenu, there will be options for a new conversation, and viewing the Agent or Chat chat history.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-70e21f800e9accde6db3ff7636da37023329d313%2FMain%20Menu%20plus%20Hamburger.png?alt=media" alt=""><figcaption></figcaption></figure>

### Chat History Submenu

Within Chat history, another submenu will offer options for a new conversation or to delete chat history. This includes the same option for New Conversation, as well as the option to Delete Chat History.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-6adb083ef016e5a44f16803d92c4789595cfd5f3%2Fimage.png?alt=media" alt=""><figcaption><p>As appearing in Visual Studio Code</p></figcaption></figure>

### Chat Input Menu

You will see a list of icons to select how to input content. Either simply type or choose one of those three icons to 1) reference a specific ***extension or code snippet**,* 2) see a list of ***custom commands***, 3) ***attach an image***, and ***4) Jira***. To the far right of that menu within the text window, there will be a cleft arrow to press in order to ***submit***.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-62cd5d2c8de54c775516b2e427efaef1a0055840%2FChat%20input%20menu.png?alt=media" alt=""><figcaption><p>[From left to right] 1) Mention specific extension or code snippet, 2) Use a custom command, 3) Attach an Image, 4) Jira, and 5) Submit</p></figcaption></figure>

After submitting a query, you can elect to stop a response while it's processing by hitting the red square button (<img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-df6da2c1262733dde60da7d6b4ffcfd94bf7c738%2FStop%20Button.png?alt=media" alt="" data-size="line">).

### Context Icons

Within the text input window, there will be tabs indicating what is currently included in the context of Tabnine Chat's answers. They will often include 1) Current file, 2) Workspace, and 3) Codebase. To the right of those tabs, there will be an option to "**+ Add scope**."

Current File — Workspace — Codebase — + Add Scope

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-cab7bc1b487844df39bf5735511439f384a65f8b%2FScreenshot%202025-02-20%20at%2018.04.03.png?alt=media" alt=""><figcaption><p>As appearing in Visual Studio Code</p></figcaption></figure>

When clicking "**+ Add scop**e," a list titled "Add context scope" will appear above the text window. Checkmarks will appear next to resources already included in context. Beneath those, there will be an option to add another repository to the context.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-8fe669ec37e4bc566eae7d51243d879c9142ff81%2FAdd%20Context%20Scope%202.png?alt=media" alt=""><figcaption><p>When you click '<strong>+ Add Scope</strong>', an additional '<strong>Add context scope</strong>' menu will appear above the text input window.</p></figcaption></figure>

When you open the **🌐︎ Remote Codebase** option, you will see options to add a 1) remote repository, 2) remote folder, or 3) remote file:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-6a06fdc8ba5fa089113bbc0a093f58df67b4c36a%2FAdd%20Remote%20Codebase.png?alt=media" alt=""><figcaption></figcaption></figure>

When you hover your mouse over a code snippet in Tabnine Chat, the following menu will appear in the bottom right corner. You can choose any of these options to add the generated code to the current file, or create a new file for that snippet:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-b7487835d1e77345bc22442b12eaaac91a5ac624%2FSnippet%20Menu%20-%20Updated.png?alt=media" alt=""><figcaption><p>Apply — Insert at Cursor — Copy — Create New File [with snippet]</p></figcaption></figure>

#### Apply

{% hint style="info" %}
Your version of this menu might be updated to look like this:\
\
![](https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-cc3b4cd146983d6747d661d57a5ca52e2274211f%2FApply.png?alt=media)\
\
It expands when you hover your mouse over it:\
\
![](https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-45e24e4dcbb2f58a4357aae40c48cab7de37c5f0%2FBlue%20Apply%20New.png?alt=media)
{% endhint %}

### Managing Tabnine

The Tabnine Enterprise logo and name will appear at the bottom right of the IDE window to manage the extension:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-f1d3352f08cc5b58c9b5b7997cc48cef776e45ca%2FTabnine%20Enterprise%20long%20logo.png?alt=media" alt=""><figcaption><p>As the Tabnine Enterprise management banner appears in Visual Studio Code</p></figcaption></figure>

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-82e6f110182d3f9e47d562ff607662ae969ac291%2FTabnine%20Enterprise%20red.png?alt=media" alt=""><figcaption><p>As the Tabnine Enterprise management banner appears in Eclipse, JetBrains IDEs, and Visual Studio</p></figcaption></figure>

In Visual Studio Code, manage the extension with the 8-spoked cog icon:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-2032212cfb70b8e6a59b0119aa186283fcc42820%2Fimage.png?alt=media" alt=""><figcaption><p>As the Tabnine Enterprise management panel appears in Visual Studio Code</p></figcaption></figure>

The menu will appear differently in other IDEs:

<div><figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-d001511566b0eca2539940a0ce95abc9132fbb10%2FEclipse%20menu.png?alt=media" alt=""><figcaption><p>The menu as it appears in Eclipse</p></figcaption></figure> <figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-68e4a13051e1572bd8853e1160fa05aed4d46638%2FJetBrains%20menu.png?alt=media" alt=""><figcaption><p>The Tabnine Enterprise menu as it appears in JetBrains IDEs</p></figcaption></figure></div>

There, you can turn off info and warning notifications, or manage the extension:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-532375436b525052686fb472d0282397c4e8d487%2Fimage.png?alt=media" alt=""><figcaption><p>As appearing in Visual Studio Code</p></figcaption></figure>

### Chat Response Menu

You can indicate your satisfaction with Tabnine Chat's response by choosing the thumbs-down or thumbs-up buttons at the bottom of the response. There will also be a copy icon in that menu and the option to apply all suggested changes:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-4139c03fa76f71e81401655d52266d17bda708a3%2FChat%20response%20Menu%2024-03-25.png?alt=media" alt=""><figcaption><p>Apply All — Copy Message — Not Helpful — Helpful (Visual Studio Code)</p></figcaption></figure>

### Chart of Icons

| Where                         | Icon                                                                                                                                                                                                                                                   | Description                   |
| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------- |
| At multiple points            | <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-c99f96542814962beffb0c344156d8bb85fa208b%2FTabnine%20red.png?alt=media" alt="" data-size="line">            | Current Tabnine logo          |
| At multiple points, some docs | <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-c9d29871d59e80eff95190f59b95e845d48e2f05%2FTabnine%20old%20colors.png?alt=media" alt="" data-size="line">   | Old Tabnine logo (old colors) |
| IDE plugin menu               | <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-174f77a4f925020d6c4a2750d25b7fb5a0c87c84%2FTabnine%20Loading%20icon.png?alt=media" alt="" data-size="line"> | Tabnine loading               |

### Chat Response

<table><thead><tr><th width="99.4248046875">Icon</th><th>Description</th></tr></thead><tbody><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-52efd967a60e1e784c77b6cfd0bacc8054983bf8%2FTabnine%20Analyzing.gif?alt=media" alt="" data-size="line"></td><td>Analyzing your request / Generating</td></tr><tr><td><mark style="color:red;"><strong>✓</strong></mark></td><td>Request complete</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-101ff78de48002b5be23f1320d5c80233b92c018%2FGenerate%20question.svg?alt=media" alt="" data-size="line"></td><td>Suggested query</td></tr></tbody></table>

### Chat Input Menu

<table><thead><tr><th width="99.6201171875">Icon</th><th>Description</th></tr></thead><tbody><tr><td><em>@</em></td><td>Reference extension or code snippet</td></tr><tr><td><em>/</em></td><td>Commands/Custom commands</td></tr><tr><td><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAAXNSR0IArs4c6QAAAuVJREFUOE+1lE9oVFcUxr/vvpmXGYs0oNW22Qhu7FApRBf+ASGFigWLCs2mddMWEqQgIsZk/jBv7uibmZgQSqcgdaEIWiruhC66CmKh0KVQaGupXbQaNRrj30zevHPKG4yOmTFMBe/ynnt+5zvfvecSr2DxFTDx0lDvgNetyfiumQc3vq9Wq7VmcU+hAwPfxt9acftDFdkJYllLBzTzdGuHrLV3opg35Peqoz90GfZmS9nrbaH5jN8HRQWqvwO82caWue5VST92NSa3k49XhE64iarfOY6+H1denbq//E61ur+h+KnSfLq0j8B2BvHBwvhQA9rf3++kUim11spCkfzI0U8BHgfoAtqlQI3QGRAjxXLu9PPQYf9LEH0Bua9USk8XsqX1GnIrKHdNWJ8sjBWmGm17XrfUEmsdyAYBvxbiE6eufyOY/8t+Ze++EBoF4qLnSKpCXyf1R1vOZZstKY6UNwSQSSOxdfbY8LX2njYpjSnXUOUsHAxSuVlFPyqOZjc3JzYUzzk733jUfX7/Ey8X4s88bYKSamKCSySvAPomFJdtJftZlJTJ+KvjYt6BmD/sseHrExMTidnZ2eTCq1jS03ymvMWIHgD4j+toJVvK3ihk/HdVcE6BFIDpeZgdLmSPAj1HnhR9IbRcztxa1Kph4KY0xCkQlwXmGwP9XIHdSr1C1WvFSm7vku03Qz3PM6gltgFSVeXPbkxszs/9O3p4dPlDI55CBgi90DE0AprA/UAURSh/cY2Wmqdn7NDYa/fiwRmqPOwIGgE1cPsg9Km4mCAr6Up6ZvGk5Uf88egyO4Nm/F4VnqRiEonEEWsPNmb+/0HTpS+o8jENh8IwJOmcoeJPQViom1hjmhavriBOidXGoZgrjuYGWi6qOFx5r87QMppnRQ+AHpC/Amj3uTTyo8oKfZugb8uZCy3QyENnLrm+bmQjRBPtlLXsGQqov01Nr/zpxInBoAXaEaTDQy/98y/F/w97k3Ql632aBwAAAABJRU5ErkJggg==" alt=""></td><td>Attach an image</td></tr><tr><td><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAAXNSR0IArs4c6QAAAoVJREFUOE+9k89LVFEcxc/3vufMaGMxY9hkKrWQMiPyH2jlzk0rd22bf0CylJp5palMDdGiYIKEbFVCRIuStDYREUQL0aSQIgqhXxrjODrz3j35xhwaHXOyH3d7v3zu+Z57juAfHFlhkhQR4d94IweNx+Pl6W92o3ZkxjFTH6LRaOZP4Dlo5Hh/rRjOBQoNQN0H+bjmS9VUOBHObgaeh0I5AwRbIPikiGei1Kgmh6PnTr78XVvWQlekCb4CMq4UHimlbp4+e2JiaamSPF+GRvprkXEGSLYUWTcpgilARgxTXXdUetyyLP0rW3LQrq7uOlMb10hdDArATQUXIZgWyF3AcwWe5Kv14DloX0fftoxHjmrbaSVwgGA1CNO9IyACd4z5+IGYFUMGy7dWnE+nZ96vhucG3Yy6ckREk1Sx2OVqO5lqsLXT6GhphHAvyD2krgTEA8ADgVeABYgMGj511ZPCu7QvnXQfWAMt5lUkEjH9/lDQmUvty9iZQwQOkmjWRBNIL0TeKiW9NIM3LCs8XwCNRqPw+/3lc3M6YGgGHI0AtA5CZDsUasVhPYF6AHWa3KWANEXGBHhomOr2qTMdE278ctBYe2xLpkIOZ7OZJkDtgDBEMgQgBDJESABwi5HP20cRPKWoER/NB5297ZM/b5iD9nT27MxCLmmN1qV/8xV8SoEf/CyiRgncKzPMJ7aRemNZlr3asvXDXziZFOCOMowhr4kXgZrAdDi8foU3gi4okVtUKgHTnASSs8WUlaRUBPMQNeQtK+uvmq58HU4cs5cLUNrJK6WyE4A0QzDs9ZoXG/bvHmtra3NKwxRO/eh+PIjs4hHD4LijFp+XsuKG3d+Mmv8O/Q7P+ygl4ObzOgAAAABJRU5ErkJggg==" alt=""></td><td>Submit</td></tr></tbody></table>

### Chat History Submenu

<table><thead><tr><th width="99.810546875">Icon</th><th>Description</th></tr></thead><tbody><tr><td><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAAXNSR0IArs4c6QAAANBJREFUOE/tlDEOgkAQRf8stJ7AysI72HoGPANeQBMEFFBBEr2AnAHOYOsdLKw8gS3LGAqJWggkbMe2P/vyMzP/ExQ8UsBEI6jr7sZ6Lqa5Xlz2+/WtzkgjqLeKjgXzXBCdg4O97AS6scIUgAEg28bOrBOoZ4cpFzBIIAuiHloz1Gr75dloUjOZeUTi+xczJmAMQXgQ4fqpcgEQ0V1qMnmfWwX1rdCUwImAQd12f3UGnhqw8GMnKTW1Tv+560+q+0Spyb6KllLSp23D0Kik20JfIp+QFuCic3MAAAAASUVORK5CYII=" alt=""></td><td>New Conversation</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-91fa85dd4c07ecb45b0131648d33d48cdce7cf7d%2Ficon%3D3.svg?alt=media" alt="" data-size="line"></td><td>Delete Chat History</td></tr></tbody></table>

### Chat Response Menu

<table><thead><tr><th width="100.15234375">Icon</th><th>Name</th></tr></thead><tbody><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-5b41b192097edc510e04261a524a19ca87999282%2Ficon%3Dapply.svg?alt=media" alt="" data-size="line"></td><td>Apply all</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-938f5ac632f9f3c6e7a678007a93ff24b5d50048%2Ficon%3Dcopy.svg?alt=media" alt="" data-size="line"></td><td>Copy</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-1c20fd126777d9ada908980d94da9aa6a5801148%2Ficon%3Dhelpful.svg?alt=media" alt="" data-size="line"></td><td>Helpful response</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-cf6d62c0769ec4ef35a6d0cbe21eb5a60e872563%2Ficon%3Dnot%20helpful.svg?alt=media" alt="" data-size="line"></td><td>Unhelpful response</td></tr></tbody></table>

### Chat results snippet menu

<table><thead><tr><th width="99.95703125">Icon</th><th>Description</th></tr></thead><tbody><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-5b41b192097edc510e04261a524a19ca87999282%2Ficon%3Dapply.svg?alt=media" alt="" data-size="line"></td><td>Apply</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-668804e0841abb493db65d26135e9881cbde769c%2Ficon%3Dinsert.svg?alt=media" alt="" data-size="line"></td><td>Insert where cursor is</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-938f5ac632f9f3c6e7a678007a93ff24b5d50048%2Ficon%3Dcopy.svg?alt=media" alt="" data-size="line"></td><td>Copy</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-df843452606382be89e822f84efff96754307264%2Ficon%3Dnew%20file.svg?alt=media" alt="" data-size="line"></td><td>New File</td></tr></tbody></table>

### Context

<table><thead><tr><th width="99.91796875">Icon</th><th>Description</th></tr></thead><tbody><tr><td><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAAXNSR0IArs4c6QAAAYRJREFUOE/tlc8uBEEQxr+qEWtwwAHxBvsUEu4cPIGEk4OQIMsyZv3ZtRHrQiTcRCI2Ev8OIl7CaU8Ojg4SCWuRmf5kxGIZYuIm+tJJVfWvq6u6vxa8DMdxtFisty3LryrbwmZSjG3flVzX9b6Kk7IjOToTt0T6KGgRCEMXCDSwk9y7ebg6yuVypbC4V+hUYr4fZLdCD0hzF5ol0AhhLyAxgPOF87PtfD7vf4x9g47NDYhKHNUPSdd1r8OgzuhCG9VfFGEMRDPBtVQmufVrqFEvLcJTFfENkQWYSKWTm+/BkTOFemmCx1rj7Zr7qh6BLhNm+H0pIkGnR7KtxvKC7JoEuHhuGtgOiCXQQTeTOAlskaBLQ0v2dXWpQ5Xx8nENxQbQKdAdN5NYjQwNbZ7jNOAxNkvDQmphYuUfGq1R/zX9VAHnj1ypFz0F5VDA4nfqX6FIorUGpgsi+6n0+HrFi3pTfv1a+UN2IihCXPr0N2azk4UK6E//qLAT+L7l1dXdBv+WCfxPQ0dIJYeap68AAAAASUVORK5CYII=" alt=""></td><td>Current File</td></tr><tr><td><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAAXNSR0IArs4c6QAAAThJREFUOE/tlEFKw1AQhv//pUFwYXGvgmvBG3gJdeeqvYAgSJs0TdI2TVoUwQvUlTv1Et5AcC2oe6kLQZK8kRaltiY0LrrrLOf9873hn2GIBQQXwMQS+tdVEaHv+yvl93KuPcO1ofi+/0lSZgmZRe1abyemvlAiH3mD1OSqKerE7dcfC0FdK6yI6END0M2DpkSDVDftyL4qBG05YSVN9V47cqp5UNcKBoah7r1gCZ3xKHP6nt2tSir7FARjvQmNUvyAxNxFDDVKCeHQ4F0rbAyKDIqeFdYEcgrhy3dBYojupFRNAKVxjrJJ8KwV2f3RH7/BU506TmdbJeoYwAGAjYlwtODyDHBr3OMkXgHc6kRfBufNp5/0FNStR0eEDgVYL3q9CLwpKNvrWdeZ0KKgebrl6Zvn0P/fvwA/8IoW7XrODgAAAABJRU5ErkJggg==" alt=""></td><td>Workspace</td></tr><tr><td><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAAXNSR0IArs4c6QAAA65JREFUOE+11V1sFFUUB/D/f2Z3ti2UWmLFJpKGQjRGjGJ8wT74QENiUt9c1FBJTRQwpCClH9vZ3c7s5+y2JSTWtIohhMRo0tUQeJCQwINPaNQHsFWpRsSQtGoBU60wuzP36DbStEgJMel9m3snv5x7zpwzxDIsLoOJu6Kj4VF9fN14vdJDDaSsAlAM+PrUjK//NDjYNbtUQEuhtCLOOoFqI7hZoOoBVgLwAF4H1AQpo9/8cOFUoVDwb8fviCZ7s02eYISQSpBjSuRZEpchfISQ8wKUAGwAtFGtwu22bbu4EL4dZbw3+wxFTgt4TpS+l/R3kLLjL6+0qSoYjAF80vPkTV2TZpIWwML12cldQ0ND7i14EWpFnEaBOiHglO4Ft/u6v4b0R0h+knDMrG1mNirBhwCHabjvwTXaBLChIc9gcSSRSHhleB4tF2Vs/fcWwZd95bek8rEJy3RaIeiiJq2JbPSCZVn3SdHIUlBNzzhgDXT+ZpvOWwJ5ogS+5jjmxCLU6rYeghY6KpCvk7loh2VZVeIaJgQbNRXcbQ90T1mWpf0b3U6l1Kvp/vi38YiziVTvi0ImlY9+sAiN92abKOpdUovAqD/jedfqdN91AJkukRnDqP9jLmfFya0CyVDpb6BizZfALw8o1zsG0c4+/uMGZ1thmz9//T4z8xwU3gbQ+H8aQiiDtXVVfR0dHTcWolugMEzgjCIvaVDVIngewt9BnBVyrrqEehjlfbIg4M8UWQnISwA/0ipKyfLnNY8me3KPeVRHQBxLOuZIridXc4NeWqitKAFdjmNeLZt9kfQLEJoCvS2Vj5xPR9MNRR/HITySzEeHAcg82tk5sKIq4I4QbLg2W7119eqrvtw09oB4UQXU9nQ6fmn//v2VK426AyCaQrraHcvELvf1Zl+BqC6h1p5yzE8XFar8YPWmWkS0wwAOJXPRASuSahZohyASS+ZjJ6LR9Fpd8Sgh52CUnKBXU1v0b54m5HNWlPbZtv3nf9BwOKw/uv6pg4B6ncA+F9rHIap3lPD+VM7c0hdJhwGmoWEvvcC4aKWTEK6ix5bEQfO7O3ZUedO2bUO5xmGINBM8LpBpAO0ikiW5C8BFkKegsAeQCoq0Jvpjn92t9+fO2tvbQ7VVD+4EGQakHsBaERgkFIBpQH4l+EVABfrj/T0X72lKzeXXsgIohhqVkqcBNmoaakTEhWBSNI7poeJXt3J4z+jCF8tz4crmK8bMzIxv23Z57P0zR5Zey/I7+RtZgKolDo687wAAAABJRU5ErkJggg==" alt=""></td><td>Codebase</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-9c8da2dfcf6d6ad5d707675242b4934a8c7a6e09%2Fterminal.svg?alt=media" alt="" data-size="line"></td><td>Terminal</td></tr><tr><td><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAAXNSR0IArs4c6QAAANBJREFUOE/tlDEOgkAQRf8stJ7AysI72HoGPANeQBMEFFBBEr2AnAHOYOsdLKw8gS3LGAqJWggkbMe2P/vyMzP/ExQ8UsBEI6jr7sZ6Lqa5Xlz2+/WtzkgjqLeKjgXzXBCdg4O97AS6scIUgAEg28bOrBOoZ4cpFzBIIAuiHloz1Gr75dloUjOZeUTi+xczJmAMQXgQ4fqpcgEQ0V1qMnmfWwX1rdCUwImAQd12f3UGnhqw8GMnKTW1Tv+560+q+0Spyb6KllLSp23D0Kik20JfIp+QFuCic3MAAAAASUVORK5CYII=" alt=""></td><td>Add scope</td></tr><tr><td><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAAXNSR0IArs4c6QAAAhJJREFUOE+1lb1v01AUxc95+WgEExRRMZT8AywMrB3oACMSUgVDS1GlDKULA9DYSWzHsZPCwNJ2iBRR6ABCQmKEoQxdGVj4B9IOqIjCBErz8S4ykqPUJApItccnv98797x77iNi+BgDEyOhIkLT9M8ngUuiMQ3IKYC/qLDfBT57nvGVpAwTNRSay+VSF85kbwsxB/AiIAkAWQBNgD2I7BF4/eVH82W9Xu9EwX9BbdtO91qpDYLXBfJBiTSg1DkReUPyJrT+psklglcF8i6R6dyzbbs9CD4GDRROnc1uErgFcsXx8y+CEovF6hV29K6k1Izr5j9alqWkPTEPkXUBXh18by4PKu5DAw/tVX9eSA9EoVw1noenW5aVlE56lqn2juM43XC9lPfvQFChiGnXjO3Q4z7UMLypZA8NIQ7VRPuu4zh6XGcEQkp5f4vAZFdhyffNg2BPH1oyvFloPqXoFWetsDsO2K/iUWVGqNah5H7ZN3eOQYur3iKBBySLOsl9pVqfBkuNHhJYonXmsurKtIi4Ajxxa+ZWBFpZJvgYwGkALSjcKPvm+1GKS4Z3DRpvAWQA/BTIQ7dW2IxfaSye/rl9jYYAh+WqsTgqgoN2BP2qj9LPKJjsJobcfix9GiiIJorpo+2gX6OJCgRYRnVhbKLCsk48+yG4P6WAOXDIlILsUf5jSoXgE5+n/xrRUf/F8pz8Bm/eWiVRhPpvAAAAAElFTkSuQmCC" alt=""></td><td>Add context scope</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-725837020804e4dd429f8432006c61fcaaabe202%2FScreenshot%202025-03-24%20at%2011.06.44.png?alt=media" alt="" data-size="line"></td><td>Number of images uploaded to context</td></tr><tr><td><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAAXNSR0IArs4c6QAAAixJREFUOE/NlE1IlFEUhp/zzW+JmFAgBQkRRJsgiCCCoFVBGFFQmxYFMlEggU3Nx+h4vZMzn5qQtnJctaiIRFy0i3IRtAiCooURFQWFFZbLdHTmOzGB4s+ogyJ01u/7cO655z3CBpRsAJP/E9rmdpxR2FZ0ZDibbflZevm6OrXJzFHf55FCHjSR7my9vy6ocb1doC8UrQO+gl5Nd7YOrxlqbnRtV6fQD5wApkTlTs10NN18u3lyTVDX9WojonFVbQKqgaGCQ1M22/J9dpPmZpqL5UJjW3/tpRCcsN2Jb+VWrb29Peznw+dQ9YAdwNtQMHg21ZF4P18/B21LZI4BaUQ0KjQkveT4YnDK9fYL/gOQPcC4CidvesmXi3Vz0JSbaQR6BGoQnkl4+ri1tjBrMMY4Oh1+jnJYYQYNNDrRyXvWWn9ZqEmYnTiRPt/XBhEU8LbkN3ml4cfjt6qqgoVuxb+iSt4RyRGJWmubJ8qNacGepuLpQxIK9KPsA8Yc5fofDT6OBIoX8bVXhKKiTx1xrlkvObpcxBdAVVVMa+YURe6qSrUIr4AnCucF6oEP+Fy2XckRESm9pmwtSVQsFgvV1dbHEOkDLRmngM3/3CIXfvz+8nBgYGBmpUNUNqbGmKhOhXsRLs0zd7379KZlcHCwuNplWzb7xjW7IZRT5KCIjIx+fH26EuCKiSqtEJOhA37AORKeKQ6lelKfV+twSaIqNVSiW9fpq/j3K+lkNc1fsLjKFsEQJt4AAAAASUVORK5CYII=" alt=""></td><td>Context included (checkmark)</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-17fbb97667a9a0d1288167573ad00894ed683035%2Ficon%3Drepo.svg?alt=media" alt="" data-size="line"></td><td>Repository</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-407a3d26426bc71bd93e6b136995d82e998a0378%2Ficon%3Dcodbase.svg?alt=media" alt="" data-size="line"></td><td>Remote codebase</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-c3e245dc9a9f08ef32cb3a5701fb4f0d3bf25a9d%2Ficon%3Dremot%20repo.svg?alt=media" alt="" data-size="line"></td><td>Remote repository</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-a4708c60acbd5e4b76c6b7f9debea37619c440ad%2Ficon%3Dremot%20file.svg?alt=media" alt="" data-size="line"></td><td>Remote file</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-b8705f7d9617525bc8df72ada462bccb6e881ca9%2Ficon%3Dremote%20folder.svg?alt=media" alt="" data-size="line"></td><td>Remote folder</td></tr></tbody></table>

### Main Input Menu

<table><thead><tr><th width="99.7421875">Icon</th><th>Description</th></tr></thead><tbody><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-539bc0dfa799a150ab9bd1dcda668748c6d96df8%2Ficon%3Dchat.svg?alt=media" alt="" data-size="line"></td><td>Tabnine Chat</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-e505342cb615d233366f17f15bf5dfa1cc5e3cb7%2Ficon%3Dmagic%20wands.svg?alt=media" alt="" data-size="line"></td><td>Tabnine Change</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-b523ba4cb5318ef7d94de7ccf65735e4e92e7097%2Ficon%3Dtest%402x.png?alt=media" alt="" data-size="line"></td><td>Testing</td></tr><tr><td><p><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-ac11a59d6d7626e3a2751a2fa08e8d5681437933%2Ficon%3Dsettings2.svg?alt=media" alt="" data-size="original"></p><p>(6-spoke)</p></td><td>Settings</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-5ffdee7da23c7ed939e76594f54f18fc5e738b46%2Ficon%3Dmenu.svg?alt=media" alt="" data-size="line"></td><td>Hamburger submenu</td></tr></tbody></table>

### Hamburger Submenu ☰

<table><thead><tr><th width="99.7666015625">Icon</th><th>Description</th></tr></thead><tbody><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-646a93c9615fe8ec6c0b3e65ca4d40f35f69f929%2Ficon%3Dplus.svg?alt=media" alt="" data-size="line"></td><td>New chat</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-c096be1dc324c09158177ddb47f02c6d57381754%2Ficon%3Dhisrory.svg?alt=media" alt="" data-size="line"></td><td>Chat history</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-b523ba4cb5318ef7d94de7ccf65735e4e92e7097%2Ficon%3Dtest%402x.png?alt=media" alt="" data-size="line"></td><td>New test plan</td></tr></tbody></table>

### Managing Tabnine

<table><thead><tr><th width="100.1083984375">Icon</th><th>Description</th></tr></thead><tbody><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-7ea46e03ba72152e711061bc6205d9059627aff0%2FTabnine%20uninitialized.png?alt=media" alt="" data-size="line"></td><td>Tabnine uninitialized</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-ac972cf2999e8a00d6ad347cd8d87ce0d2247c7f%2FTab%20Enter.png?alt=media" alt="" data-size="line"></td><td>Tabnine Enterprise (VS Code)</td></tr><tr><td><p><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-f219071d6d7322d399992eceeed630f2269121b1%2FTabnine%20Enterprise%20Settings.png?alt=media" alt="" data-size="original"></p><p>(8-spoke)</p></td><td>Management Settings (VS Code)</td></tr></tbody></table>

### Models

<table><thead><tr><th width="99.625">Icon</th><th>Description</th></tr></thead><tbody><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FOuilkkNxykRs9PtRkcuu%2FThinking%20Icon.png?alt=media&amp;token=e09424e2-bb50-437a-aaff-52674ec3c3fc" alt="" data-size="line"></td><td>Thinking Model</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-0dbc6c508c902dd575a9366c0762bea4f93e2442%2Ficon%3DClaude.svg?alt=media" alt="" data-size="line"></td><td>Anthropic/Claude</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-3807221a97472486361ebcb3c9c2db2242319374%2Ficon%3Dgpt.svg?alt=media" alt="" data-size="line"></td><td>ChatGPT/GPT-4o</td></tr><tr><td><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAAXNSR0IArs4c6QAAAqdJREFUOE+1lE1oXFUYhp/3JI2R2h+qtgHrSgrSjdQoRXClu26KNivBZVHrQghJmpmJnTvJdO40sX+KQnUhtAQXrgotVJCCggtBV03RgF0UtAhpFUf7M5nc8+pYx/aaxDSLnt3lfu9zXr7vPZ+4D0f3gckiaLlcDrHZu0PKttusk7XkxZJthetB/japlS4C7hjMCZLk/YfircZbkO0BHgc9CIsv/kdsRBNzQYR6pV44twjaduhmbwHHIcTGVbQlGp8Lcc1rlcn9P7Z1/zodH037F/BH4B2rAHZKZyNxX7X+9vkc9ECh+irmCOiR1UIFM1F6fSItfvUfaG0v9jvA+tVAbVpBTM9LI2lanMtDS9XdZHrv9oDu8Yg/gFNBfJDUSjOLBzVyaGsMrY9FeBG8Un4bf/X+tBVOhFvN7ypHK7/cbSMnLo+mL5hsGtS3lFeJBtbJLOt+tzo18sPd2VwW2v5RLtS2G0awn0U8gJWBf45wRtKXhi0BBjBPY/8meXpe4dNOP3M9bX8kw5N9C93NZ7pi2JRZN9TFT8Gaa4V4fU30HqMBYCfQe8eZbsqc6JXGC/XCrzlosXhwS3dkGHjl71jJs0Ec3tS37pOrV34fAg4APUu1xfYloTfHD5U+y09/tPoS0nHcmb6M/bkUa0bHQE8tmwnRsBmeqJc+zEP3196wPCVYe0fsC0QOI0pI2/4naFeRB8fTsVM56Fih9nIwx8Fbb4tl5PNqMUi3U6Ndy0Aj5gsF7aukxe9z0CRJNrvZU7AZAG8ALiMde+zawyevbJzrd9AU5klEZ3O1V90NzIyCjlTS4tlOxPKrbyjZ7NDzvLt4VM5mNzTXfj14dPBm+/aJsckn5lut54K83pba+zRajRD0TSUtzi67T+/xca5YttJzXBGwVMGf8ywPJX69RsUAAAAASUVORK5CYII=" alt=""></td><td>Command R+</td></tr><tr><td><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAAXNSR0IArs4c6QAAAjRJREFUOE+1lT9ME3EUx7/v1z93ttEGz5hCnNw0cXFTJyYXDZPRwU3Ff7E6GA7B0jukcGJcwIgQNhfSSRMXF500TjoYnByNEFM1RZv2uPb3zO8sKActV5Le+nu/z3u/9973e4QOfNQBJtahuVxOxwoSEBBaXGM37nq2ba80S2qaTkoIGd0NwK26bNSMcmY646r4f9A746dYyosQpEOqA1qE7pq2bdeC4EKhEFn88HlSsjxMTIpRJUnz9oOhFxug2cGxawSaBJBsQN4K3eu1LGs1CO3vn42l9xZfAzjROCszeOCec/dxayjzO9K9kwBWl5Z66nNzlz0F6+7+GqlUEjFd1F4CONYeFFD9/AiAATwbdYYfZs3x24K4j/+27QiAPe1C119NwBPbGb6aHczPEHBli+GFfP5/N4mwUI9Ii+rCIsa5IJSBMkL1dOPNEoBvAPYDSG2qlPAboIHRiaGZ7aYfXhfhoVQB+EuwOgZK5FdNBwDe5WcODWW8lxw9H4nUR6Tks0T+xCUTFgQoz+CnYBxVzHZ6+mb5x77etFGcBuMSAKGgIMwKzbslqzG1/MdbrtSImb8OglJUohHoQ3uM7zclcx/Il6ME8/Of5eVHXcn0qx1DVQKlorWpKXVpmiu6kr92BG2q/akbU1oxHHTsNIguEEiTkBAsPjVzKeuMFeeD0fsMOtSYfpWI5u2JgEv5forUWj8BlGqt/NQxnZQUMqqgbtxlwzDKmUzAT8Nv+vaRHfmd/AF40Scloq4+SgAAAABJRU5ErkJggg==" alt=""></td><td>Mistral</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-11ea2353753655e5e498e3c2d1602647bedee838%2FGemini.png?alt=media" alt="" data-size="line"></td><td>Gemini</td></tr><tr><td><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAAXNSR0IArs4c6QAAAplJREFUOE+1lUlIVWEcxc/57vU+y0WSG4Uii2hTFA3QILoRomnTgFTuWrh4WTSQ+Z7ova/U98pFENSmWiZhwyoQWuemiZIssCIaiBZZEZlv8H4nfGhZmNr0338/Dv/zP+cj/sPwPzAxJdT3fYOct0QhKxiqB0XZh4lEwk4mZlJocORkaWiyu0HuIFgoKA3pimOHO4OO4O2vwBNC8+oyhesFGxNYQuJMaOx1x5otEvYSGiBMEpH0jYlU/wDt6upy+h/0z8lak4S0HYAL4FlolXBn5K4GQZBpbm4tN6HTDGgroG4qF1+8YvGrmpqacEz5D9CWxmQtZH2RL0g9hlQF4j7BlZBeSzydM7wzMFDysWz2+2rRHoJFOWgSx1KxixNC/ca2MwLmZ+TsigBVQLiPhvUIbTEcUythNWh7KefK4LDbU1T02VHGu0TgeSLVtHdipUfbzoqYcTwV3+PHkpsF7adMNJGKPfV9v1A5rxIht4NaSvB2zuiCY3GQwtCxE03RKaBNe1ribZtkdUChoq0dzU9GHuQN/DSrWN7QWpL7BS3I713onhbUj7VvtMJBuW60tbUhDx0/dXV1BWUl5dckbYBwbtpQWR2iYTSRjPePACUxFUsVD8muGVW6EKALaXpKW+KpDQjDw2PQIAg8+6WgUgbbCCwneNdq+DzoHJh0p2PuM5LdqbRXAYPDBOsxrJlwWQtpHYBHgLnMwsxNSWZq98fdqRF6RVQTuitglcB3hjjFXPZW2aeyD2+me6cjieq71zdXjLR/TxRfEjyOSLoTQDYM3XkmN5oow27P2NiiZYte/zJRY+7+0+z/fDbBkaA0NO63lgKUVr6lvM6go+H3Wmo8PK960FsihxV01IOCv+zTP/0Vpmz+PwF/BUspfCUAr4hoAAAAAElFTkSuQmCC" alt=""></td><td>Tabnine Protected</td></tr><tr><td><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAAXNSR0IArs4c6QAAAx9JREFUOE+9lE1oXFUUx//nvpl5k4A2hVSxglCsFHRRuhBxIXQjJYoLBSsi2gatYmgKCUkz8zIz992XmfcyJiRI+uHzW+zKgBs/qrgpCKWCmy5a+mGooKRgqqYWm5n3Zs6RCU6dmSbYTXuX957zu//zSbgNh24DE3ceOjg4aPd0b9qqVGKb1LGBLFxlrp23uvii67rRelGuqVRrrazIfjyG7IegZhGdZsGQIsyKyHYmJBTLYaTjk8YY7oTfBNVaJxAlByDqaUYt5wX5H4lIChn/F2/SeSAMw8TiwtIOVmpCWfwVEvERY0ytFdwGnRma6frDXtmvgH4h2jcRZE8CJA0HL+M9WlHWr0lWzwL42iK5vyb8npD6cGMlfXh4dnilCW6D6qz/nEB2gq3vRPGD537aOjc/v7veNC44pT6wvFhTNGYJvUDMC1D0JIFOmMD5/Cao1tO9Uq3mlMLHuuScNqNmkzvtLgFYVdo4Ouu/DfACUvEh+pt69ZReMuP+dmbsJdsuGjNypWF3Q6nOTOwUJB4jOx0aM7TcmXzHKd2bEHxJoJdM4Fy48ZGe7ZFq5Q1C7QczmT/RBi1k/T3EUqeu+LPWdgl12H258vshJukHcIrsaJcx5q8m1HXdlKwkd4siywucT9qhY/6bIOkjoktkR6NNcCFTfB6gPRTTQaQQiPAxbzI333BeBVZSUwLZAqHjXtk52qm0HyK9SuG464+faeYyl/WfIsY+kfqnSqlXCPyOmcx/869Scp3SI8zoA9EVL3A+6lBa2gXCw2RHH7SGl8kEG22Wl1nhIRI5V4V1rFzOXP0vp/puqaZeheCsVx7/tr1QB/VmsVI5jnmqOJ2/1FoovVen482pDdeu3bU8N3eg2vqWG5nYopJqlOpR0bxlFtugjU4oOKUBrqGn26J3K0IDKl0N1prxMAyTiz//mbXBR6/X5XWV4GXPzx9ppqy9+bXuRmS/D8F9IjzjlXNfrLc0CmPFZ4jUsBAuU6r6mjHm+poTtVrRkal7VDLeVgic79cDNu+9rP8Ex9F5d9r9bd3Z/z/Irb7f+SV9q8o67f4BxvxfJSkEmbYAAAAASUVORK5CYII=" alt=""></td><td>Optimized for performance</td></tr><tr><td><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAAXNSR0IArs4c6QAAAsBJREFUOE+11U9IVFEUBvDv3Dc6lpahEGi4EIXIEMtNC2lVUJEVFCNEaRGBK2dR4sw4M96544zzx4VSKwWNVhqCtDDMoBathCCKSCWwaKERlYsyc8Z598QEI6OOmopve+/7ncN5372PsAsP7YKJTVHZJPfrPGulwXzUJHov5mPv1H31c6Nm1kNJtsgiNqznAJwi5lJNNEfMhSD6CJjPyUyMqqj6AoBXF1iBMjO1u8LVJukbYDrDwB8iPNFxGjZEbMY0rIcE8WVmrgVjDwk8NVg89Iacr4loGV+BSldHrWbuJ8Y0SNzL1WLEEXX8Wt1JpCWy77fQtWBtZ0KZILqlQq0jqX0r0DZnyAaYyh/2VKw3M5/Pl11QUEB2uz2W3NPmDEwAhvSHXUPro2wqfyQzKqXM4VjWeSJhFhbljSbhNkdgArQD1ONsPysgnCB6IKzxAZ/PF98SKqW06FhOFevEfCDq/SCdoTJm/QiE0VxtiaRmvSW0s7kzd94SdzNwmgy2s0mDzHglcuL1SqnF1Pz+Aw1cAVPQH3EfSeZPykgxYol2ABcZPEWxvZdU1525FJiMoHR1TBJRqwq1Dmf8UF5XRw0xD5K2nFBRx2xyk9sdKBEJcU1b9EAw6PmcngqPp7NUJJZemlrbglHPeEZUyq4DHF8YI/AzFfJ4NzqKNpvNqCg73s3gykVtuRBNy/OaY9rmDF1l0l0Muh1IC/SqAiQdwXoQdbLgBn+Heyx9fQ36r4PyKh8zXQe4eXL67eOhoSEz9VJPT0/W7Kfv9QApgIKwLvYqpfSGaHIxGSeOZd8FcJOBF8JE31IWZijBJRZBjcyoESS6K6rL+urq6pYLZpxperWmpiZrfm7xSQFuAFDOwDeCPkigKU3U//VH4Xhvb+NSprlvep86HOH8bKGPGcyHmXkKC0tvtnuf7uiHsGmn29H/As6yVSWnmJXoAAAAAElFTkSuQmCC" alt=""></td><td>Private</td></tr><tr><td><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAAXNSR0IArs4c6QAAAjlJREFUOE+11E1IVFEUB/D//z6d0YgEo1VIOzFskWCLWomBUJughbQIXKURtAlyxvl6vvl8ThREEDG1SCgIg6BNCyG3LZKkRR+4i5aRUIHNjL77jwkMJfWNA97tvefHPefce4h9WNwHE2Eo3XjpGKhBAUcIfIO46PlTXwBopwvtiLqua2w9eprSTQCnBHQR+AHgrchbJlJ743me3Q7eEc0n8z31gPcADBCaAc0CZIcFxgAsRRxdTxVSX/eEuvHcsGBegpxkpPbQ87x113XbVI9egVQm7AXPTy80jTZSR7XzshhkLex43k/PbwSn4rkRA1OhnAw6fj/ZrgTbpt9AVY+OQUrBYDxbTL7eQDOJwllYVEDmGanNNoXOzc057xeXBxzDiwDGIJTbDBc30HWrQRCTAGZp9aJ/sHdpdHQ02FyG/26aSZRiCOwEiEMAuiCtgKz+C5I6QHaj8RKEnzKs5EoJf3c0XvgsopvC/bCPIeIahZWsn+wLQ5cJrnl+on/zwb/NW+88AwWrXjH5rrHnxosfBLVn/WRv06jrugdIGkmrqkbOgcoBuJ31U09bR+OlEcEOSfhIg2mBjw8Gzt1YOfarZXQ6UThhLcoAThJ8XpXJzMzEG1/172opfUlMp/N9JnCGjn4//GiiMrG2pc57qOkngm1BEJwP677jOK8ErWf95PHdGzVVfCDpEoH2MFTAGsln2VLi6q5o8ka+x4maEVh1hKEwrAY1O1+4s3VahQ3pULfpKdWStCnoDw+gFiVBBxrYAAAAAElFTkSuQmCC" alt=""></td><td>Private and protected</td></tr><tr><td><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAAXNSR0IArs4c6QAAAoBJREFUOE+11M9LVFEUB/Dv947vzSiSILmQbGOrFApc1Kr+gYI2QbaohRCIRv5IHX3OzJs3M88ZJ5E2ESWtpUW1iaJdUJuwLAqiwIG0H4TZTzLn17snplAilRrRu7z38rmHc885xBYsboGJstFoR7S6WOurq8kG5vvH+hfXCqos1O6xa8Vv9gI4CHKGpjngOH0Lf8NloZFg4giIy4B6C8hOkq6TtM5vGLVtuxY584EIMqBMQOBS4YaTDA2VjYoIE+FEY6GoroBoINgn0DUQpACcjqVC19ZFLcutN7Te62lfVemSUlqE6pMSr1KougG0ALSpfI+1V3AJ7gN1NwWv6XlPo+ei75fxlZyGg24rCRtAzfKhQL4QNADmlJLEkue77afXDiD++458hHARCrfoVaSddPBNaXcFjQTdTpARpVSXaJkX6qMQtgFyU6BGX2Smp5uamsQoGvU5rRqBCvXL1cX9JLoA9sZSQ1dXoSQtIHeguaV59tmjmR5SWqml3UmHHq7XJKGB+G6l1D1QD8WS4YlNQe2ge1KACIDO2Ojwnc1BLfciNPZ4Wrcl0uGXm4JGBkeeUCSDQP6E4zg//o1Cjgu99ngqMrVWTu2z9nYxzAyBC05q2FpVUqXfX/4o+DGn80YvNEcAeUXivlacMoDnhYKeq1bGQrYyu6TzxikIYhApNcHkKtQeTHSIMC7EdZDfKXK41AMgvkFQCzAAERMKFRD6BKIIFAWc8hXzx6Jj0fm1Ij1E8oxASsUvJN5B1CUGcncl628QpXcpjR0aqBPKNqWVqRU++5U5GXL7Zv9Mz0rxj/eMV3715+pBCXieT6p83oKVtD5sZIiXNfr+94EtQX8CedU+JcID/ZIAAAAASUVORK5CYII=" alt=""></td><td>Recommended</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-ebdd5d13957cc3c32defdf704d0a96495b39e3c7%2Ficon%3DQwen.svg?alt=media" alt="" data-size="line"></td><td>Qwen</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-46ec5493ccc6d53ef68f3b5808066815437ac54e%2Ficon%3Dlama.svg?alt=media" alt="" data-size="line"></td><td>Llama</td></tr></tbody></table>

### Provenance & Attribution

<table><thead><tr><th width="100.357421875">Icon</th><th>Description</th></tr></thead><tbody><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-9e123c2dc548351166c54da23a3cefa0bb3e8d7a%2Ficon%3DAttribution.svg?alt=media" alt="" data-size="line"></td><td>Attribution</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-cb7d049bbaade6907c907b6163d03fe7e3511daf%2FAlert%20icon%20thicc.png?alt=media" alt="" data-size="line"></td><td>Licensing restriction</td></tr><tr><td>(button)</td><td>Reissue code without licensing issues</td></tr></tbody></table>

Deprecated / Replaced Icons

| Category | Icon | Name |
| -------- | ---- | ---- |
|          |      |      |
|          |      |      |
|          |      |      |


# Tabnine Agent

## Introduction

**Tabnine Agent** extends the capabilities of Tabnine beyond inline code completion and conversational chat by introducing an **autonomous, task-oriented AI assistant** that can act directly within the developer’s environment.

Unlike Tabnine Chat, which provides on-demand natural language conversations with underlying models (such as explaining code, generating snippets, or answering documentation queries), **Tabnine Agent** **operates autonomously to achieve the user’s specified goal** and can perform higher-order development tasks. These tasks can include codebase-wide refactoring, automated test generation, documentation synthesis, and policy validation.

### What is Tabnine Agent?

Tabnine Agent can be seen as an initiative-enhanced version of Tabnine Chat. On top of that, Tabnine Agent adds and explains more of its reasoning to the user.

Unlike other agentic approaches, Tabnine Agent maintains a tight feedback loop with the developer. It independently determines when to check in for input or approval, such as requesting to *Proceed* with a complex agentic workflow.

This ensures that the agent remains aligned with user intent and minimizes introducing redundant or conflicting code within large, enterprise codebases.

Agent will take into account the current state of a project as well as context to make its decisions. It will in turn respond to state changes, take dependencies into account, break down complex tasks for better processing (and clearer explanations to users), and respond to user feedback to make project code edits.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FI1O508zyuUgEphI43xFS%2Fchat-to-agent-switch-20260422-204218.gif?alt=media&amp;token=88a4afb2-0878-4d2e-b35f-ac55528a7323" alt=""><figcaption></figcaption></figure>


# How to Use Tabnine Agent

This guide walks you through using Tabnine Agent effectively, from basic interactions to advanced workflows.

### IDE **Quick Start Guide**

When you open Tabnine in your IDE, look up to the top of the app and select <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-834a667f9b7e818024bd6df966912c00e085f0c9%2Ficon%3Dmagic%20wands%402x.png?alt=media" alt="" data-size="line">**Agent**.

Then, before you type into the prompt box at the bottom, select which model you want from the dropdown menu beneath the top menu.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FUPiAFnQIaOShxQgIpfR3%2Fswitch-models-in-ide.gif?alt=media&amp;token=dbfe7dff-840f-4e76-9169-21c2b8e1b219" alt=""><figcaption></figcaption></figure>

Before you prompt, make sure to have a project folder open in your IDE. This is so that Agent has a place to save new project files. Without it, Agent won't work properly.

#### Prompt

Scroll down to the prompt box and **describe** your goal in plain language. Agent's strength is evaluating your end goal and describing what it will to do get you there. This launches Agent into [Plan Mode](/main/getting-started/tabnine-cli/features/plan-mode).

This will let you understand exactly what Agent plans to do and precisely how it plans to structure your project.

In this example, we ask Agent to plan out a simple translation application.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FNZHrRaxk8WPsrjxA6yBL%2Fbasic-spanish-translation-app.gif?alt=media&amp;token=f6483465-8fe8-455f-8680-1fbcfa67d2e9" alt=""><figcaption></figcaption></figure>

You can see its description of the plan is thorough. It lays out its reasons for each file, shows what the project directory will look like, then asks if we would like it to continue.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2F0VAJMfBtMguMqYV1SnqT%2Fplan-mode-finished.gif?alt=media&amp;token=7badad32-ac1a-44dc-95cd-a4bc70b4b91a" alt=""><figcaption></figcaption></figure>

Once that's done, we can tell Agent to proceed or make any notes about changes we would like to see in its plan:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FfgMYyeL7wiJ7pCUFZANJ%2Fapprove-mvp-with-small-change.gif?alt=media&amp;token=f74b507d-4a12-4b6f-be4e-9b8fcc83f45a" alt=""><figcaption></figcaption></figure>

Once you confirm, Agent will generate the files.

You’ll initially be met by a brief “Working…” message below the red Tabnine logo, followed by a description of what Agent intends to do with its response.

#### Approve

It will then ask you for confirmation to <mark style="background-color:blue;">**Run**</mark> or <mark style="color:blue;">**Reject**</mark> the file generation for each file (unless you change this to automatic in the Settings).

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-46cd570f1671a08f371305164cc78ff0d1e0e143%2FCreate%20all%20files.gif?alt=media" alt=""><figcaption></figcaption></figure>

When it generates the code for a file, you can create that file by hitting the **Apply** button.

To approve changes to a new version of an existing file, select the circled, green checkmark <mark style="color:green;">✓⃝</mark> above the document window (or reject by hitting the red x mark <mark style="color:red;">ⓧ</mark>).

{% hint style="success" %}
This option will only appear if
{% endhint %}

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-63d95ae429eec498a83eba9522f6df6cccaa5df9%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}
*Do I have to approve “changes” to the file if it’s a new file (i.e., click the green checkmark)?*

No. On the initial creation, you can do without clicking it because there are no additional changes — the file now exists. For edits, absolutely. Once you click the checkmark, it will automatically close both the original file and the window comparing the original file code (in <mark style="color:red;">red</mark>) to highlighted changes (in <mark style="color:green;">green</mark>).
{% endhint %}

***

#### Reject

If you select <mark style="color:blue;">Reject</mark> the request for whatever reason, Tabnine Agent will then clarify it is unable to finish the task, then list a number of other options.

In this case, the terminal command was rejected because it identified the wrong folder.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-fcaf6322cfd28e0c4830ba020f0aa8cb594ab65f%2FReject%20command.gif?alt=media" alt=""><figcaption></figcaption></figure>

***

Once complete, you can see all the files in your profile folder:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-99a446abcbcc5bec60708bba623649ba0a906173%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

### Native Tools

Tabnine Agent contains several Native Tools that help it access your project files, create new ones, edit current ones, or search your project context. All of these can be edited in [Settings](/main/getting-started/tabnine-agent/agent-settings).

You’ll be met with the following options:

1. Read Project Files
2. Create Project Files
3. Apply Code
4. Read Terminal
5. Run Command
6. List Directory
7. Get Diagnostics
8. Workspace Search

{% hint style="info" %}
You will see indicators for the different Native Tools for most steps of the process. This will help you keep track of Agent’s own workflow. They will appear like this in the conversation with the Agent:

<mark style="color:orange;">•</mark> Exploring and <mark style="color:green;">•</mark> Explored

<mark style="color:orange;">•</mark> Creating and <mark style="color:green;">•</mark> Created

<mark style="color:orange;">•</mark> Reading and <mark style="color:green;">•</mark> Read

<mark style="color:orange;">•</mark> Applying and <mark style="color:green;">•</mark> Applied
{% endhint %}

### Edits

You can directly request changes from Tabnine Agent in the prompt window, specifying what you would like to change and in what way, as seen in this example below:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-2635ab6d2bc7898085c96af4afefef40adbdf89c%2FEdit%20Agent.gif?alt=media" alt=""><figcaption></figcaption></figure>

### Predefined Slash Commands

When the user inputs “/” at the beginning of a new message (at the beginning or middle of a conversation), it opens a dropdown list of pre-defined slash commands for Tabnine Agent.

When the relevant command is selected, it will have the “command” background.

Current predefined commands include the following:<br>

* `/code-review`
* `/test`
  * Generates focused test cases and implementations for the relevant code changes
* `/describe-pr`

  * Drafts a structured, reviewer-ready pull request description for your changes

  <br>

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FoPj4tO8WDDiK2xBX5E0F%2Funknown.png?alt=media&amp;token=2cf5d8ea-f22b-41d6-9a9f-de0bcadaae5d" alt=""><figcaption></figcaption></figure>

### Skills in Your IDE

Using the Tabnine IDE plugin, Agent Skills can be configured in two ways, by loading all subdirectories containing `skill.md` files for project-level and user-level skills in two different locations:<br>

1. Project-level skills: `<project-root>/.tabnine/skills/`
2. User-level skills: `~/.tabnine/skills/`


# Agent Guidelines

## Guidelines Overview

Guidelines are a powerful feature of Tabnine Agents that allow you to define custom behaviors, workflow rules, and system prompts through simple Markdown files. Think of guidelines as custom instructions that shape how your agent behaves and operates within your specific development environment.

### What are Guidelines?

Guidelines are Markdown files stored in your project’s `/.tabnine/guidelines/` directory that act as:

* **Custom System Prompts**: Define how the agent should behave
* **Workflow Rules**: Specify procedures and processes to follow
* **Tool Instructions**: Control how and when tools should be used
* **Team Standards**: Encode your team’s coding practices and conventions

### Creating Guidelines

To add custom guidelines for use by Tabnine Agent, create a new directory called `.tabnine`.

This directory will either reside either 1) in your home directory or 2) on a per-project basis within your project directory.

After that, create a `/guidelines/` folder in the `/tabnine/` directory either in your Terminal or manually.

Once in the `.tabnine/guidelines/` directory, save a markdown file (`.md`) with written instructions in natural language. Tabnine Agent will interpret the text.

There is no *real* structural requirement, but it is still a best practice to list the various guidelines in a *hierarchical structure* for easy interpretation, both by Agents and other users.

Your location will resemble `$PROJECT_FOLDER/.tabnine/guidelines/appguidelines.md`.

As noted above, you can save multiple guideline files.

{% hint style="info" %}
Think of these in a similar fashion to the `agents.md` file that other agentic tools use.
{% endhint %}

Here is a common example of a `guidelines.md` file with hierarchical structure:

```markdown
# Team Coding Standards
## Overview
This guideline defines our team's coding standards and practices for consistent code quality.
## Instructions
### Code Style- Use meaningful variable and function names
- Follow language-specific naming conventions (camelCase for JavaScript, snake_case for Python)
- Keep functions small and focused (max 20-30 lines)
- Add comments for complex business logic
### Error Handling- Always handle errors gracefully
- Use try-catch blocks for operations that might fail
- Log errors with appropriate context
- Provide user-friendly error messages
### Testing- Write unit tests for all new functions
- Maintain minimum 80% code coverage
- Include integration tests for API endpoints
- Use descriptive test names that explain the scenario
## Examples
Good variable naming:
userAuthenticationToken = generateToken(user);
const isValidEmail = validateEmailAddress(email);
Bad variable naming:
const t = generateToken(user);  // Too generic
const flag = validateEmailAddress(email);  // Unclear purpose
```

{% hint style="info" %}
It is recommended to keep your `guidelines.md` file to 500 lines or less.
{% endhint %}

### Governance for Agentic Guidelines

Guidelines configured in the Admin Console apply to CLI sessions in the same way they apply to IDE chat sessions. No additional configuration is required on the CLI side. When guidelines are active, they are injected automatically at the start of every agent session.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FzaqswyyvxWZSQDBilJ4A%2Fagent-guidelines-screen.png?alt=media&amp;token=e7380008-38eb-4934-8120-6e284b0f1cd2" alt=""><figcaption></figcaption></figure>

In the Admin UI, navigate over to Agent Guidelines on the left-hand side of the page.

Beneath the **General Guideline** title, you can add your natural language guideline description. They will also be applicable to all your organization’s users and projects.

Guidelines that are input here will have the same effect as guidelines listed in your `guidelines.md` file, but they will take precedence over personal guidelines that exist in the `guidelines.md` file.

{% hint style="info" %}
These changes will be applied in the IDE extension after 15 minutes, or upon restarting the IDE or the extension
{% endhint %}

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FHNjCCaT8ZCIa1HDQ0yon%2Fgeneral-guideline-example.gif?alt=media&amp;token=6bfb8364-bba8-44c9-b8e0-9c1164f61a8c" alt=""><figcaption></figcaption></figure>


# Understanding MCP Servers

## What is MCP?

The **Model Context Protocol (MCP)** is an open standard for connecting large language models (LLMs) to external tools, data sources, and APIs. *MCP servers* implement the MCP. They act as standardized interfaces that allow language models to communicate with external applications or systems—similar in concept to APIs, but specifically designed for LLM-driven interactions.

With Tabnine Agent, these are managed in a similar manner to creating guidelines, through a specific file.

***

### MCP Server Configuration <picture><source srcset="/files/Umo5VpirA5UUXVCPG5f8" media="(prefers-color-scheme: dark)"><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-b12bfdf91f6dbf1b2297b3bf2126bc97d2d849be%2Fmcp-black.png?alt=media" alt="" data-size="line"></picture>

{% hint style="info" %}
A project folder must be open for the MCP list to update. If Tabnine is open in you IDE without a workspace folder, the Tabnine MCP engine stays dormant. It won't read global or local JSON.
{% endhint %}

MCP servers are configured through a JSON file under the `.tabnine` folder in your project root:

First, enter the same `/.tabnine/` directory inside your project directory.

{% hint style="success" %}
`.tabnine/mcp_servers.json` can **also** be placed in the home directory:\
\
`~/.tabnine/mcp_servers.json`
{% endhint %}

To direct to specific MCP servers, create the `mcp_servers.json` file, which will follow this structure here:

```json
{
    "mcpServers": {
        "server-name": {
            "command": "server-executable",
            "args": [
                "arg1",
                "arg2"
            ],
            "env": {
                "API_KEY": "your-api-key",
                "BASE_URL": "https://api.example.com"
            }
        }
    }
}
```

In that `mcp_servers.json` file, list each server you want to include. For each server mentioned in the file, Tabnine Agent requires the following configuration components:

1. `mcp_server` — this is the top-level container
2. `<server-name>` – the name of the server itself
3. `command` – the script command that launches the server

Optional fields include:

4. `args` – command line arguments (with no spaces, otherwise they’ll be treated as separate paths)
5. `env` – environment key-value pairs

Here is an example of that structure filled in with variables for Jira:

```json
{
  "mcpServers": {
    "mcp-atlassian": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "mcp-atlassian:latest"
      ],
      "env": {
        "JIRA_URL": "https://mcp.atlassian.com/v1/mcp",
        "JIRA_API_TOKEN": "7H15-15_Ju57-4_54Mp13-4P1_C0D3-f0R_47145514n-Bu7_U-c4N-g3N3R473-Y0Ur-0Wn_Fr0M-y0Ur-J1R4_4Cc0Un7-47-1D-47145514N-C0M"
      }
    }
  }
}
```

***

### Supported Transport Layers <a href="#transport-types" id="transport-types"></a>

The service automatically detects the transport type based on your configuration:

| ***Detected Transport*** | ***Configuration Field*** | ***Use Case***               |
| ------------------------ | ------------------------- | ---------------------------- |
| **STDIO**                | `command` present         | Local MCP servers, CLI tools |
| **Streamable HTTP**      | `url` present             | Modern remote APIs           |
| **SSE**                  | `transport: "sse"`        | Legacy remote servers        |

***

### Commonly Used MCP Servers

There are dozens of available MCP integrations on the market, official MCP servers for individual third parties. Here are a few of commonly used ones:

<table><thead><tr><th width="178.9739990234375">Category</th><th>MCP Servers</th></tr></thead><tbody><tr><td>Development Tools</td><td><ul><li><a href="https://github.com/github/github-mcp-server"><strong>GitHub</strong></a> <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-cd28a4f62c11fcbb8dae30bad751b9da1cf6303c%2Ficon%3Dgithub%402x.png?alt=media" alt="" data-size="line"></li><li><a href="https://docs.gitlab.com/user/gitlab_duo/model_context_protocol/mcp_server/"><strong>GitLab</strong></a> <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-f0c8c729dd97f4a29416936c633e087936377eca%2Fgitlab2%402x-1.png?alt=media" alt="" data-size="line"></li></ul></td></tr><tr><td>Project Management</td><td><ul><li><a href="https://github.com/makenotion/notion-mcp-server#readme"><strong>Notion</strong></a> <picture><source srcset="/files/hAe7CtyHXTSOwEdEaJB4" media="(prefers-color-scheme: dark)"><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-5920cff5bce23affa0cf45c5ceb51eabf7a168e0%2FNotion_App_Logo-672x700.png?alt=media" alt="" data-size="line"></picture> - For Notion API</li></ul></td></tr><tr><td>CloudOps</td><td><ul><li><a href="https://github.com/microsoft/mcp/tree/main/servers/Azure.Mcp.Server"><strong>Azure</strong></a> <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-7c750318da4477aa49b555b3a3f3f7e5c6060a2d%2Fazure.png?alt=media" alt="" data-size="line">- Access to Azure Storage, Cosmos DB, the Azure CLI, etc.</li><li><a href="https://github.com/microsoft/azure-devops-mcp"><strong>Azure DevOps</strong></a> <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-dcfbf853d685cd5aef312a6013235441d0e56ef9%2FAzure%20Devops.svg?alt=media" alt="" data-size="line"> - Specific to services like repos, builds, releases, tests, code, etc.</li><li><p><a href="https://github.com/awslabs/mcp"><strong>AWS</strong></a></p><p><picture><source srcset="/files/vMZRd3I1KkKhh6F1gsFW" media="(prefers-color-scheme: dark)"><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-fbcde29d2b74c2be4406f5fd299744bc50b46286%2FAmazon_Web_Services_Logo.svg%20(1).png?alt=media" alt=""></picture></p></li><li><a href="https://github.com/awslabs/mcp/tree/main/src/cloudtrail-mcp-server"><strong>AWS CloudTrail</strong></a> <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-c9ac878154d2cff18f223f6a9a9604795d8d8a76%2FAWS-CloudTrail_light-bg%404x.png?alt=media" alt="" data-size="line"></li><li><a href="https://mcpservers.org/servers/awslabs/cdk-mcp-server"><strong>AWS CDK</strong></a> <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-05c4815a8b448011c95a2d81bb96700e944f5132%2Faws%20cdk.png?alt=media" alt="" data-size="line"></li><li><a href="https://github.com/awslabs/mcp/tree/main/src/core-mcp-server"><strong>AWS Core</strong></a></li><li><a href="https://github.com/googleapis/gcloud-mcp"><strong>Google Cloud Protocol</strong></a> <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-e9d755e8fcaf177463ef47441095e2210ae16681%2FGoogle%20Cloud.svg?alt=media" alt="" data-size="line"></li></ul></td></tr><tr><td>Database Tools</td><td><ul><li><a href="https://github.com/googleapis/genai-toolbox"><strong>MCP Toolbox for Databases</strong></a> <strong>(open source)</strong></li><li><a href="https://github.com/idoru/influxdb-mcp-server"><strong>InfluxDB</strong></a> <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-665636a62175fd24231ee72d0fb2f3ecd31cf4f8%2Finfluxdb-logo.png?alt=media" alt="" data-size="line"></li><li><a href="https://github.com/qdrant/mcp-server-qdrant"><strong>Qdrant</strong></a> <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-f2878fbbdc38f38faea1b38814958aeee67e1354%2Fqdrant%20logo.png?alt=media" alt="" data-size="line"></li><li><a href="https://github.com/ClickHouse/mcp-clickhouse"><strong>ClickHouse</strong></a> <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-f2144b5d7ee85fe5e1f0134dc88a2404b3f7ced4%2Fclickhouse.svg?alt=media" alt="" data-size="line"></li><li><a href="https://github.com/neondatabase/mcp-server-neon"><strong>Neon</strong></a> <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-d3299b576e5dd1eace7b8a555ed05743e716ae62%2FNeon.png?alt=media" alt="" data-size="line"></li></ul></td></tr><tr><td>Languages &#x26; Frameworks</td><td><ul><li><a href="https://github.com/sveltejs/mcp"><strong>Svelte</strong></a> <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-a8849cf9f84fcaae213227a5baeb7dcc310e26f6%2FSvelte_Logo.svg.png?alt=media" alt="" data-size="line"></li><li><a href="https://www.npmjs.com/package/next-devtools-mcp"><strong>Next.js</strong></a> <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-5adfd9c664b728eab3648fb436ffc83fcb3a70b6%2Fimage.png?alt=media" alt="" data-size="line"></li></ul></td></tr><tr><td>Monitoring</td><td><ul><li><a href="https://github.com/grafana/mcp-grafana"><strong>Grafana</strong></a> <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-5a46c8ebd54915094f8b8ed1e95576e520b50321%2FGrafana_icon.svg.png?alt=media" alt="" data-size="line"></li><li><a href="https://www.elastic.co/docs/solutions/search/agent-builder/mcp-server"><strong>Elastic</strong></a> <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-b95507cd54b288035ff7e01a013a38e522fff42e%2Felastics.svg?alt=media" alt="" data-size="line"> (Elasticsearch &#x26; Kibana)</li></ul></td></tr></tbody></table>

## Configuration Examples <a href="#configuration-examples" id="configuration-examples"></a>

#### Local MCP Server (Stdio Transport) <a href="#local-mcp-server-stdio-transport" id="local-mcp-server-stdio-transport"></a>

**Detected by**: Presence of `command` field

```json
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/Users/username/Documents"
      ],
      "env": {
        "NODE_ENV": "production",
        "DEBUG": "mcp:*"
      },
      "cwd": "/Users/username/workspace"
    }
  }
}
```

**Properties**:

* `command` (required): The executable to run
* `args` (optional): Array of command-line arguments
* `env` (optional): Environment variables for the process
* `cwd` (optional): Working directory for the process

#### Remote MCP Server with JWT Authentication <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-30d2a983434526f2885839f00612f317b04ec7e5%2Fjwt-3.svg?alt=media" alt="" data-size="line"> <a href="#remote-mcp-server-with-jwt-authentication" id="remote-mcp-server-with-jwt-authentication"></a>

**Detected by**: Presence of `url` field (defaults to Streamable HTTP)

```json
{
  "mcpServers": {
    "my-api": {
      "url": "https://api.example.com/mcp",
      "requestInit": {
        "headers": {
          "Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
          "Content-Type": "application/json"
        }
      }
    }
  }
}
```

**Properties**:

* `url` (required): The MCP endpoint URL
* `requestInit` (optional): Standard Fetch API RequestInit object
  * `headers`: HTTP headers to include in all requests
* `sessionId` (optional): Session identifier for the connection

#### Remote MCP Server with API Key (multiple headers) <a href="#remote-mcp-server-with-api-key" id="remote-mcp-server-with-api-key"></a>

This example shows how various authorizations might appear in the `mcp_servers.json` file.

```json
{
  "mcpServers": {
    "weather-service": {
      "url": "https://weather-mcp.example.com/mcp",
      "requestInit": {
        "headers": {
          "Authorization": "Bearer token",
          "X-API-Key": "api-key",
          "X-Client-ID": "client-id",
          "X-Environment": "production",
          "X-Session-Token": "session-token-value"
        }
      }
    }
  }
}
```

#### Legacy SSE Server <a href="#legacy-sse-server" id="legacy-sse-server"></a>

**Detected by**: Explicit `transport: "sse"` field

```json
{
  "mcpServers": {
    "legacy-api": {
      "transport": "sse",
      "url": "https://old-api.example.com/sse",
      "requestInit": {
        "headers": {
          "Authorization": "Bearer legacy-token-123"
        }
      },
      "eventSourceInit": {
        "withCredentials": true
      }
    }
  }
}
```

**Properties**:

* `transport` (required): Must be `"sse"`
* `url` (required): The SSE endpoint URL
* `requestInit` (optional): Request configuration
* `eventSourceInit` (optional): EventSource-specific options
* `authProvider` (optional): OAuth client provider (advanced)

{% hint style="info" %}
Some MCP servers can silently fail OAuth authentication after a token is revoked on the provider side. When this happens, the local cached OAuth credentials remain in place, and the OAuth flow is *not* automatically re-triggered.

These cached OAuth credentials are stored in the .`mcp_auth` folder in your home folder. The fix is to remove the .mcp-auth folder. This removes all cached credentials and will force all new OAuth flows to retrigger.

Delete the `.mcp_auth` folder from the user’s home directory. This clears all cached OAuth credentials. The next MCP action requiring authentication will correctly trigger a fresh OAuth flow.
{% endhint %}


# MCP Server Config

Tabnine IDE and Tabnine CLI support. [Model Context Protocol](https://modelcontextprotocol.io/) (MCP) servers. This extends the CLI with additional tools and context providers. MCP servers are configured in `settings.json` and managed with the `tabnine mcp` CLI commands or the `/mcp` slash command in interactive mode.

## Configuration File Location

MCP server configurations live in the `mcpServers` key of `settings.json`. The CLI loads settings from multiple scopes, merged in this precedence order (highest wins last):

| Priority    | Scope           | Path (macOS/Linux)                                                                                          |
| ----------- | --------------- | ----------------------------------------------------------------------------------------------------------- |
| 1           | Schema defaults | Built-in                                                                                                    |
| 2           | System defaults | Sibling to system settings                                                                                  |
| 3           | User            | `~/.tabnine/agent/settings.json`                                                                            |
| 4           | Workspace       | `<project>/.tabnine/agent/settings.json`                                                                    |
| 5 (highest) | System          | `/Library/Application Support/TabnineCli/settings.json` (macOS) or `/etc/tabnine-cli/settings.json` (Linux) |

MCP servers use a **shallow merge** strategy: workspace-level servers merge with (not replace) user-level servers. If the same server name exists in both scopes, the higher-priority scope wins.

Workspace settings are only loaded if the workspace is trusted.

## Configuration Format

### Stdio Transport (Local Process)

```json
{
  "mcpServers": {
    "server-name": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/dir"],
      "env": {
        "TOKEN": "your-token"
      },
      "cwd": "/optional/working/directory",
      "timeout": 30000
    }
  }
}
```

### HTTP/SSE Transport (Remote Server)

```json
{
  "mcpServers": {
    "remote-server": {
      "url": "https://example.com/mcp",
      "type": "http",
      "headers": {
        "Authorization": "Bearer your-token"
      }
    }
  }
}
```

When `type` is omitted, the CLI tries Streamable HTTP first and falls back to SSE automatically if the HTTP connection fails. Set `type` explicitly to `"sse"` or `"http"` to skip auto-detection.

### Configuration Fields

| Field          | Type                             | Description                                                                                              |
| -------------- | -------------------------------- | -------------------------------------------------------------------------------------------------------- |
| `command`      | `string`                         | Executable to run for stdio transport.                                                                   |
| `args`         | `string[]`                       | Arguments passed to the stdio command.                                                                   |
| `env`          | `object`                         | Environment variables set for the server process.                                                        |
| `cwd`          | `string`                         | Working directory for the server process.                                                                |
| `url`          | `string`                         | URL for SSE or HTTP transport.                                                                           |
| `type`         | `"stdio"` \| `"sse"` \| `"http"` | Transport type. Defaults to `"http"` when `url` is set.                                                  |
| `headers`      | `object`                         | HTTP headers sent to the server (useful for authentication).                                             |
| `timeout`      | `number`                         | Request timeout in milliseconds. Defaults to 600000 (10 minutes).                                        |
| `trust`        | `boolean`                        | When `true` and the workspace is trusted, tools from this server are auto-approved without confirmation. |
| `description`  | `string`                         | Human-readable description of the server.                                                                |
| `includeTools` | `string[]`                       | Allowlist of tools to enable. When omitted, all tools are enabled.                                       |
| `excludeTools` | `string[]`                       | Tools to disable even if exposed by the server.                                                          |

## MCP Management Commands

### Adding a Server

```bash
tabnine mcp add <name> <commandOrUrl> [args...]
```

| Flag                      | Description                                          |
| ------------------------- | ---------------------------------------------------- |
| `-s, --scope`             | `"user"` or `"project"` (default: `"project"`)       |
| `-t, --transport, --type` | `"stdio"`, `"sse"`, or `"http"` (default: `"stdio"`) |
| `-e, --env`               | Environment variables as `KEY=value` (repeatable)    |
| `-H, --header`            | HTTP headers as `"Key: value"` (repeatable)          |
| `--timeout`               | Connection timeout in milliseconds                   |
| `--trust`                 | Bypass all tool call confirmation prompts            |
| `--description`           | Server description                                   |
| `--include-tools`         | Comma-separated tool allowlist                       |
| `--exclude-tools`         | Comma-separated tool blocklist                       |

***Example:***

```bash
tabnine mcp add filesystem npx -y @modelcontextprotocol/server-filesystem /path/to/dir --scope user
```

### Listing Servers

```bash
tabnine mcp list
```

Status indicators: `✓` Connected, `✗` Disconnected, `⛔` Blocked, `○` Disabled.

### Enabling and Disabling Servers

```bash
tabnine mcp enable <name>
tabnine mcp disable <name>
```

Both accept a `--session` flag for session-only changes. Persistent enablement state is stored in `~/.tabnine/agent/mcp-server-enablement.json`, separate from the server configuration. Servers are enabled by default.

### Removing a Server

```bash
tabnine mcp remove <name>
```

Accepts `--scope` (`"user"` or `"project"`, default: `"project"`).

## Interactive Mode: `/mcp` Slash Command

In interactive mode, the `/mcp` slash command provides these subcommands:

| Subcommand | Aliases        | Description                                    |
| ---------- | -------------- | ---------------------------------------------- |
| `list`     | `ls`, `nodesc` | List configured MCP servers and tools          |
| `desc`     | `description`  | List servers and tools with descriptions       |
| `schema`   | —              | List servers, tools, descriptions, and schemas |
| `auth`     | —              | Authenticate with an OAuth-enabled MCP server  |
| `reload`   | `refresh`      | Reload MCP servers                             |
| `enable`   | —              | Enable a disabled MCP server                   |
| `disable`  | —              | Disable an MCP server                          |

Running `/mcp` with no subcommand defaults to `list`.

## Runtime Flags

### Filtering MCP Servers

```bash
tabnine --allowed-mcp-server-names server1,server2
```

When this flag is set, only the named servers are loaded. The comma-separated format and space-separated format are both accepted.

## Examples

### Filesystem Server

```json
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/home/user/projects"]
    }
  }
}
```

### GitHub Server

```json
{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "<YOUR_TOKEN>"
      }
    }
  }
}
```

### Remote HTTP Server with Authentication

```json
{
  "mcpServers": {
    "custom-api": {
      "url": "https://my-api.example.com/mcp",
      "type": "http",
      "headers": {
        "Authorization": "Bearer my-token"
      },
      "trust": true
    }
  }
}
```

## Troubleshooting

Verify your servers are configured and reachable:

```bash
tabnine mcp list
```

For detailed connection diagnostics, start the CLI with debug logging:

```bash
tabnine --debug
```

### **Using Environment Variables in MCP Server Configuration**

MCP server configurations in `.tabnine/mcp_servers.json` support environment variable interpolation, so you can reference secrets and tokens stored in your OS environment instead of hardcoding them into config files.

#### **Supported Syntax**

| Syntax             | Example              | Resolves to                        |
| ------------------ | -------------------- | ---------------------------------- |
| `$VARIABLE_NAME`   | `$SONARQUBE_TOKEN`   | Value of `SONARQUBE_TOKEN` env var |
| `${VARIABLE_NAME}` | `${SONARQUBE_TOKEN}` | Value of `SONARQUBE_TOKEN` env var |

On Windows, `%VARIABLE_NAME%` is also supported. Both `$VAR` and `${VAR}` syntaxes are equivalent and follow POSIX/Bash conventions via `dotenv-expand`.

{% hint style="info" %}
The `${env:VAR_NAME}` syntax used by some other tools is not supported.
{% endhint %}

Environment variables are resolved in the following fields:

* `env` values in stdio transport configurations (environment variables passed to child processes)
* `requestInit.headers` values in SSE and Streamable-HTTP transport configurations

Other fields such as `url`, `command`, `args`, and `cwd` are passed through as-is and do not undergo interpolation.

Variables are resolved at connection time, not when the config file is loaded. If you update an environment variable, the new value takes effect the next time the MCP server connection is established.

If a referenced environment variable is not set, it is replaced with an empty string. No warning is displayed.

The following configuration uses environment variable interpolation for both SSE header authentication and stdio environment variables:

```json
{
  "mcpServers": {
    "sonarqube-mcp": {
      "url": "https://sonar.example.com/api",
      "requestInit": {
        "headers": {
          "Authorization": "Bearer ${SONARQUBE_TOKEN}"
        }
      }
    },
    "gitlab-mcp": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-gitlab"],
      "env": {
        "GITLAB_PERSONAL_ACCESS_TOKEN": "${MY_GITLAB_TOKEN}",
        "GITLAB_API_URL": "https://gitlab.example.com/api/v4"
      }
    }
  }
}
```

Multiple placeholders and literal text can be combined in a single value. For example, `"Bearer ${TOKEN}"` resolves to `"Bearer sk-abc123"`. This feature is supported in VS Code and JetBrains. The CLI has built-in environment variable expansion.


# In-IDE Agent Settings

Settings for Tabnine Agent, including Native Tools

## Tool Permissions

You can define which tools in Tabnine require user approval by using the **⚙︎** Settings → Tool Permissions → Native Tools panel.

To save time with Tabnine Agent, you can turn on **Auto-approve ▾** from a dropdown menu in Settings.

Navigate to the hamburger menu symbol (the three lines ≡), then:

* Go to **⛯ Settings**.
* Scroll down to and click **Tool Permissions ▾.**
* Finally, select **Native tools ▾**.

Here are the Native tools that will be available, complete with examples:

| Native Tool            | What It Does                                                                          | Example Usage                                         |
| ---------------------- | ------------------------------------------------------------------------------------- | ----------------------------------------------------- |
| Read Project Files     | Lets the Agent view code or documentation files to understand context.                | “Explain what this function does.”                    |
| Create Project Files   | Generates new files or directories with content.                                      | “Create a new `README.md` for my project.”            |
| Apply Code             | Writes or edits existing files based on your request.                                 | “Add input validation to the `login.js.` file”        |
| Read Terminal          | Reads command output to understand your environment.                                  | “What version of Node am I using?”                    |
| Run Command            | Executes terminal commands in your workspace.                                         | “Run npm install.” or “Run pytest.”                   |
| List Directory         | Lists files in a given folder for context.                                            | “Show me what’s inside /src/components.”              |
| Get Diagnostics        | Gathers environment or dependency info to debug issues.                               | “Run diagnostics. Check for missing Python packages.” |
| Local Workspace Search | Searches your workspace for code or text patterns.                                    | “Find all functions named fetchData.”                 |
| Search File Content    | Local code‑aware search that Agent uses when answering queries or generating changes. | "Search for API endpoints like /api/v1 or /api/v2"    |

For each tool, you can pick from the following options:

* <mark style="color:green;">**Auto-approve**</mark>
* <mark style="color:yellow;">**Ask first**</mark>
* <mark style="color:$info;">**Disable**</mark>

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-0c6aacae892e3a7b9fccf03cadcd6df1eb190426%2FTool%20Permissions.gif?alt=media" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
It is recommended to require user approval for sensitive operations.

However, options like `Run Command` and `Apply Code` will frequently come up as options in Tabnine Agent. Depending on your needs, you might elect to auto-approve these prompts for quicker results.
{% endhint %}

### **Context Engine Tools**

This **Directory & Symbol Index** includes new (or updated) search tools for navigating and finding resources in remote codebases (repositories, source code, folders, files, classes, functions, variables, etc.):

* `remote_repositories_list` - Lists all remote repositories available to your team
* `remote_symbols_search` - Searches for code symbols (functions, classes, variables) in remote repos by prefix
* `remote_symbol_content` - Gets complete source code content of symbols from remote repos
* `remote_repository_folder_tree` - Gets folder structure of a remote repo
* `remote_files_search` - Searches for files by path/name in remote repos
* `remote_file_content` - Fetches full content of specific files from remote repos
* `remote_semantic_and_textual_search` - \[previously called *`remote_codebase_search`*] Performs semantic RAG and lexical search across remote repos.

### Add New MCP Servers

Within the Tabnine IDE plugin, users can manage their MCP servers by adding new ones and configuring their permissions.

To do this, navigate to the three-line menu symbol ☰, then select ⛭ Settings.

Once there, select Tools and **MCPs ∨**, then select **MCP servers ∨**.

Select the option **+ Add MCP server** and input the server’s information. This will open (and create if needed) the \``.tabnine\mcp_servers.json`\` file where you can configure the MCP servers.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FsmOIqv8jdOnf46PD7alC%2Funknown.png?alt=media&amp;token=6d734080-cc91-4a87-9de6-cb55ad2189ab" alt=""><figcaption></figcaption></figure>

Once added, you will be able to select one of three options for handling results from each MCP server that is available:

* <mark style="color:green;">**Auto-approve**</mark>
* <mark style="color:yellow;">**Ask first**</mark>
* <mark style="color:$info;">**Disable**</mark>


# Agents in Action

## Creating a Wiki in Notion from the IDE

{% embed url="<https://www.youtube.com/watch?v=tFhhAgmihVo>" %}

## Adding Nullness Annotations to a Java Project

{% embed url="<https://www.youtube.com/watch?v=uwUg1QPfXqY>" %}

In this example, there may be a null pointer exception when the Customer returned from the service is null. However, the built-in static analysis in vscode (and similar tools) is not able to track the data flow in the program and flag that.

```java
public class App {
    public static void main(String[] args) {
        CustomerService customerService = new CustomerService();
        NotificationService notificationService = new NotificationService();

        Customer customer = customerService.getCustomerById("999"); // This is null
        String email = customer.getEmail(); // NPE here!

        notificationService.sendEmail(email, "Welcome!");
    }
}
```

One way to assist the static analysis is to add so called *nullness annotations*. These annotations make tracking dataflow easier by tagging parameters, fields, and return value of functions as `Nullable` or `NotNull`.

After adding the annotations, the agent is able to fix the code to deal with these potential null values. It modifies the code, and the tests to match the new corrected code.


# Agent Usage Analytics

In the Admin Console, navigate to <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-57a765c917b3a04425e58120960a5ef755fb1bea%2FAnalytics%20symbol.png?alt=media" alt="" data-size="line"> **Analytics** on the lefthand side menu. Select **Agent Usage**.

The Agent Usage page will display the following information: monthly spending trends, usage by model, and usage by team.\
\
Under **Month trend,** you will see a tracker for how much budget has been spent and how much is remaining.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-ba087ce955f5f92740a3e04f46c63855488d4964%2FScreenshot%202025-10-30%20at%2011.19.51.png?alt=media" alt=""><figcaption></figcaption></figure>

Below that you will see **Usage by Model.** This chart will track usage of all available models, focusing on total tokens. input tokens, output tokens, cache read, cache write, and finally the amount of money spent per model (in USD).

This example shows the breakdown of all those numbers:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-c8425079353b9ac043ca99f189cc9f3e9edec85e%2FScreenshot%202025-10-30%20at%2011.19.57.png?alt=media" alt=""><figcaption></figcaption></figure>

Finally, **Usage by Team** will breakdown not just the amount of money spent by each team, but the percentage of use spread across the organization:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-21534047b469aeb932fa21301fefa48b10895770%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>


# Tabnine Chat

{% hint style="warning" %}
For SaaS (EMT) customers, Tabnine applies a fair-use token consumption limit on a per-user, per-day basis.
{% endhint %}

### What is Tabnine Chat?

Tabnine Chat is a code-centric chat application that **runs in the IDE** and allows developers to interact with Tabnine’s AI models in a flexible, free-form way, using natural language.

Tabnine Chat also supports dedicated quick actions that use predefined prompts optimized for specific use cases.

### Getting started

To start using Tabnine Chat, first [launch](/main/getting-started/tabnine-chat/launch) it in your IDE.

Then learn how to [interact](/main/getting-started/tabnine-chat/interact) with Tabnine Chat, for example how to ask questions or give instructions.

Once you receive your response, you can[ read, review, and apply](/main/getting-started/tabnine-chat/consume) it within your code.

### Getting the most out of Tabnine Chat

As with any other AI tool, it's important to understand what can be expected from Tabnine Chat, and how to interact with it for the best possible results.

#### **Tabnine Chat is all about code**

Tabnine Chat has been trained mainly on open source code with an additional set of English-language data to support the chat interaction in natural language.

This means that Tabnine Chat:

* Was designed to answer code-related issues
* Provides the best results when the questions and context look like real code
* Wasn't designed to answer questions about general knowledge or emotions

#### **Help the AI to focus**

Another important aspect is that Tabnine Chat, like similar AI tools, is backed by an LLM model that can take large input and return a long answer. In most cases, you want to receive a focused answer.

The best way to keep the Tabnine AI focused is to follow these best practices:

* Use detailed and specific [prompts](/main/getting-started/tabnine-chat/prompt).
* Use specific [context](/main/getting-started/tabnine-chat/chat-context/context-context-window).
* Use different [conversations](/main/getting-started/tabnine-chat/conversations) for different tasks and topics.
* Try a step-by-step approach to solving a larger problem.
* Define how you want Tabnine Chat to respond ([behavior](/main/getting-started/tabnine-chat/interact#custom-chat-behaviors) and [response length](/main/getting-started/tabnine-chat/interact#chat-response-length)).

#### **Didn't get the response you wanted?**

Here are some tips:

* Try asking a slightly different question or providing more detailed instructions.
* Make sure you've selected the relevant code before you ask a question.
* Consider opening a new conversation (with a fresh chat history).


# Launching Tabnine Chat

How to launch Tabnine Chat in your IDE

### **VS Code**

1. Click on the Tabnine icon located on the left sidebar:

![](https://2500895905-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F03uIXF1SrI5fdiuQqdFr%2Fuploads%2F8lm05jtnKebJTpSMiAKP%2Fimage.png?alt=media\&token=b843ffef-d7f6-4650-b0a0-3cfb96755b7a)

2. The Tabnine Chat panel will open on the left side of the IDE:

![](https://2500895905-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F03uIXF1SrI5fdiuQqdFr%2Fuploads%2FpbOvcQldN55ZYos4vDNE%2Fimage.png?alt=media\&token=f848ef57-b82e-41c6-b124-4a77193f28fa)

### **JetBrains**

1. Click on the Tabnine icon located on the right sidebar:

![](https://2500895905-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F03uIXF1SrI5fdiuQqdFr%2Fuploads%2FI1g0TFEebMMpy2Xz7zdg%2Fimage.png?alt=media\&token=7ccf7227-73f2-46bd-b2f2-37bc651928d6)

2. The Tabnine Chat panel will open on the right side of the IDE:

![](https://2500895905-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F03uIXF1SrI5fdiuQqdFr%2Fuploads%2FI6vdRHrlHX9SPn7qQ5FM%2Fimage.png?alt=media\&token=4e30692d-f930-45ee-891c-c91888197e31)

### **Visual Studio 2022**

Go to **Extensions > Tabnine Enterprise > Start Tabnine Chat**

Or:

Click the Tabnine icon located on the status bar and then **Start Tabnine Chat:**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-d824217a16925586faabf80ba180c4280f2fff06%2Fimage.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

### **Eclipse**

Click the Tabnine icon located on the status bar and then **Open Chat:**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-e72fa9fecc54ec993e5d1f77a5de7bc635d7bb7a%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>


# Interacting with Tabnine Chat

How to interact with Tabnine Chat

You can interact and trigger Tabnine Chat in three ways:

1. [Free-form natural language prompts](#option-1-free-form-natural-language-prompt)
2. [Quick actions (global)](#option-2-quick-actions-global)
   * [User-defined quick actions (custom commands)](#user-defined-quick-actions)
3. [CodeLens (method scope)](#option-3-codelens-method-scope)
4. [Personalizing Tabnine Chat](#personalizing-tabnine-chat)

### Option 1: Free-form natural language prompt

Go to the bottom of the Tabnine Chat panel, enter a free text question or instruction, and then click **Enter**.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-5b08ab41fc54266a25e17ce54c8053f9e690bf55%2Fimage.png?alt=media" alt=""><figcaption><p>Write a prompt in natural language and click <strong>Enter</strong></p></figcaption></figure>

Tabnine Chat's answer will be rendered quickly:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-593a3b297b0c205e2d605d3f43f5370b1232943d%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

Another recommended option is to select a block of code from the current open file and then ask a question regarding this code. This draws Tabnine Chat's attention to the relevant code:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-062ae77bb46af8346b0b860c2f98ccbf94495191%2Fimage.png?alt=media" alt=""><figcaption><p>Select a code block and give a relevant instruction</p></figcaption></figure>

You can ask anything you want, but keep in mind that Tabnine Chat was designed to answer questions related to code. If you write good prompts that are specific, detailed, and to the point, you increase the chances of getting an accurate and useful result.

#### Mentions

In the natural language prompt, you can use Mentions.

Mentions (using the @ mark) are a way to ask Tabnine Chat to use a specific code element (type, method, or class) from the workspace in the query context. Mentions allow the user to leverage their domain knowledge and help the AI by explicitly focusing it on relevant context from the workspace.

Notes:

1. Mentions work for each language with Language Server Protocol (LSP) support in the IDE.
2. Type 2-3 characters after the “@” to view the available code elements.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-d37ae7c633b169582240debd13e66c482fe78c21%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

Learn more about the [Tabnine Chat context](/main/getting-started/tabnine-chat/chat-context/context-context-window) and [prompt engineering](/main/getting-started/tabnine-chat/prompt).

#### Symbols

You can now use Mentions for "symbols." Symbols represent additional resources that you want to add to the chat context.

To add, use the % sign and then type the file you want.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-6f62d5b2c4a1960794684c419d4540c84f7eb9fc%2FCensored%20Symbols.png?alt=media" alt=""><figcaption></figcaption></figure>

<table><thead><tr><th width="55.0087890625"></th><th></th></tr></thead><tbody><tr><td></td><td><strong>Language Availability for Symbol Mentions</strong></td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-051bf254ad782820627890ef2b0e06fbae63dc6e%2FJava.svg?alt=media" alt="" data-size="line"></td><td>Java</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-e0e096a24e59fb9f1e501899389e3905c6c27cd7%2FPython.svg?alt=media" alt="" data-size="line"></td><td>Python</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-7975261bd47d0112fab7f5a376e1293e56a55584%2FJavaScript.svg?alt=media" alt="" data-size="line"></td><td>JavaScript</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-e1db5f196597f0815d315dfacf4191bb3df75fa4%2FTypeScript.svg?alt=media" alt="" data-size="line"></td><td>TypeScript</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-d0841f2e61ed3d92232b9cd2c1fbfb4dff4853a1%2FC.svg?alt=media" alt="" data-size="line"></td><td>C</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-acc487eb512c10a78f653a41a72c3f77400bf660%2FC%23%20(CSharp).svg?alt=media" alt="" data-size="line"></td><td>C#</td></tr><tr><td><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-6cae2226d09d9b41d074169a19955cbffa104698%2FC%2B%2B%20(CPlusPlus).svg?alt=media" alt="" data-size="line"></td><td>C++</td></tr></tbody></table>

### Option 2: Quick Actions (Global)

Some tasks or instructions are common, so Tabnine Chat includes them as built-in actions.

The following actions operate on the selected code:

* **explain-code:** Explains what the selected code is doing
* **generate-test-for-code:** Writes tests for the selected code
* **document-code:** Suggests documentation for the selected code
* **fix-code:** Fixes the errors (detected by the IDE) for the selected code

You can trigger quick actions by clicking the relevant links when you start a new chat session:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-aa7970facaea1655cd4fe35d67d5d241ec4285f3%2Fimage.png?alt=media" alt=""><figcaption><p>Click quick action links on new chat</p></figcaption></figure>

Another option is to use "/" to view the available quick actions. Select the action you want and click **Enter.**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-c3db460aa106ace8a981d8f2ff33332dafe19498%2Fimage.png?alt=media" alt=""><figcaption><p>Click "/" to view the available actions</p></figcaption></figure>

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-10db62bf378506de52200a0a8ff61737e6126f0d%2Fimage.png?alt=media" alt=""><figcaption><p>Example of "Explain code" action</p></figcaption></figure>

#### User-defined quick actions

In addition to the predefined commands provided by Tabnine, you can define your own custom commands. This can be useful for repetitive tasks that are specific to your domain:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-949356f6a853293986b6bc5aca45b08086773aeb%2FCustom%20command%20edited_20.gif?alt=media" alt=""><figcaption></figcaption></figure>

To define your own quick action, follow these steps:

1. Click on the **Settings** (<img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-ea60b94769e5eb824538aa287767025a86c830a4%2Fimage.png?alt=media" alt="" data-size="line">) icon in Tabnine Chat.
2. On the Chat settings tab, click **Add** in the **Define custom commands** section.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-da946908380200a94e64e7c8f4797a87c3d66932%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

3. Fill in the slash command name, description, and prompt template fields in the **Define new Command** dialog. Use **$** to include a reference to the **selected code** or **open file** and save the custom command.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-c02149ad6a6cbab6c513024c7b2e5069568341a4%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

4. Use the slash ("/") to trigger your custom commands in the chat prompt.

{% hint style="info" %}
Note: Custom commands are personal and saved on the local machine, per IDE. They're not shared between different users or between different IDEs on the same machine. However, they can be shared through an SCM tool.
{% endhint %}

#### Sharing Custom Commands

1. You can then choose to share with your team members, which will prompt Tabnine to create a .tabnine\_commands file within each repository.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-ef5b5b433c7b573a8f1f8848d4975ed74e015a22%2Fcommands.png?alt=media" alt=""><figcaption></figcaption></figure>

Users can easily create, edit, and delete commands through this file. The shared file is the single source of truth for commands, making collaboration more seamless and efficient. Each team will be responsible for managing this file. At this time, shared commands do not support mentions.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-ed23ad04746bc9379c1931d765f430639266e7a3%2F03%20Sharing%20Custom%20Commands_768_456%20(1).gif?alt=media" alt=""><figcaption></figcaption></figure>

### Option 3: CodeLens (method scope)

{% hint style="info" %}
Available in these IDEs (for these languages):

* **VS Code** (Java, Python, TypeScript & TSX, JavaScript & JSX, Ruby, Go, Rust, Swift, C/C++, C#, PHP)
* **JetBrains** (Java, Python, TypeScript, Rust, Kotlin, PHP, GO, C/CPP, C#)
* **Visual Studio** (all supported languages)
  {% endhint %}

You can trigger the quick actions for the scope of a specific method by clicking the floating Tabnine quick actions:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-b562aa55fa180f0caa91043a99b366052af3fe11%2Fquick%20actions%20-%20method%20scope.gif?alt=media" alt=""><figcaption></figcaption></figure>

### Personalizing Tabnine Chat

#### Chat Response Length

You can now customize your Tabnine AI Chat experience even further, allowing for more control over chat response length and style. Users can pick between “Concise” for a shorter answer, and “Comprehensive” for a longer, further explanation to your prompts in Chat.

1. Click on the **Settings** (<img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-ea60b94769e5eb824538aa287767025a86c830a4%2Fimage.png?alt=media" alt="" data-size="line">) icon in Tabnine Chat.
2. On the Chat settings tab, click the **Response Length** section.

From there, you can select either Concise or Comprehensive.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-81c3126fd962b9949b05b60d2fa854b80ddc38cb%2F02%20Chat%20response%20length_768_456.gif?alt=media" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Concise is the default Chat Response Length.
{% endhint %}

#### Custom chat behaviors

You can specify how Tabnine AI Chat will behave in certain ways (e.g., “Respond like a mentor with step-by-step instructions and examples” or “Respond in German/Spanish”).

Follow these steps to define your custom chat behavior:

1. Click on the **Settings** (<img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-ea60b94769e5eb824538aa287767025a86c830a4%2Fimage.png?alt=media" alt="" data-size="line">) icon in Tabnine Chat.
2. On the Chat settings tab, click **Set** in the **Define custom behavior** section.

From there, you can determine how Tabnine will act before you prompt the AI Chat.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-3032d313a84ba7ff18f80617bed05bae15a9c29c%2F01%20Custom%20chat%20behaviors%20768_456.gif?alt=media" alt=""><figcaption></figcaption></figure>


# Reviewing suggestions

Tabnine AI code assistant: Reviewing suggestions

## How to review the Tabnine Chat suggestions

Once you get an answer from Tabnine Chat, review it. If you aren't satisfied with the answer, refine your original request with an alternative or a more specific prompt **in the current or new session**.

If you're happy with the response, you can add it to your code in one of the following ways.

### Manual Copy and Paste

Copy the answer (or part of it) and paste it into the relevant location in your code:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-53d8af6982ff3841c092ec3c1e349856c7dd86cd%2Fmanual%20copy%20paste.gif?alt=media&amp;token=73ec2b56-7299-40e1-850d-bad8875c2abc" alt="" width="563"><figcaption></figcaption></figure>

### Copy Function

Click **Copy,** then paste the answer into the relevant location in your code:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-649b8ff0bbb9c863d50b3e015f3c877d4179ed92%2Fcopy_raw.gif?alt=media&amp;token=72df3a8b-2b35-4ba1-8b0c-5d43670b3b57" alt="" width="563"><figcaption></figcaption></figure>

### Insert Action

Click **Insert** to copy and insert the code into the open file with one click.

The code is pasted at the cursor location or inside the selected block:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-a4664f72e3517d37291fec501aa6b7bb78473110%2FInsert.gif?alt=media&amp;token=6448b6d5-713e-460e-b899-b7778bf39666" alt="" width="563"><figcaption></figcaption></figure>

### Show Diff

If the Chat answer is close enough to the current open file, a **Show diff** option appears. Click **Show diff** to see the specific change offered by Tabnine.

To paste the changes into the file, click **Insert**.

{% hint style="info" %}
Diff insert is available in VS Code, JetBrains and Visual Studio 2022
{% endhint %}

In VS Code, you'll need to **Accept** each change inline:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-2f3262817a89754459a4711e314dc5ed95b753ab%2Fshow%20diff_latest.gif?alt=media&amp;token=3ad4925a-0fa6-43fc-9bf3-fc816caef576" alt="" width="563"><figcaption><p>Show diff, Insert, and Accept in VS Code</p></figcaption></figure>

### Apply

Within Chat, you will have the option to apply suggestions directly to the relevant code snippet in your target file.

After generating a response, the Apply button will appear in the upper right-hand corner of the code snippet. Simply click and the code will be inserted.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-d67f1741b1feb78a1fce73173ff81d0d7f2819a8%2FLonger%20scripts%20include%20an%20Apply%20button%20in%20the%20top-right%20corner.gif?alt=media" alt=""><figcaption></figcaption></figure>

You should receive confirmation of changes with a screen that lists the files where code changes were applied, similar to this:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-b5197cf47dc3cf33d5a0d16c5d3bddb96950c428%2Fimage.png?alt=media" alt=""><figcaption><p>Changes applied successfully using the 'Apply' button in Tabnine</p></figcaption></figure>

#### References

If the context for local code awareness is enabled, by default the Tabnine Chat tries to answer the user questions with context from the local workspace. When returning the answer to the user, Tabnine Chat is explicit about the context used to answer the question by including a list of references:

<figure><img src="https://lh7-us.googleusercontent.com/ZVxhJ2hiw7zDcHHHeUmxRgn3xYHQq63tMN8tlH6EZ4WnQ4MuVw5JO8gN04chVw_Ft8uByddl7i-ubYP4PWdPfqDOpGo24y6bpQGOo0TgWhA7Gf3ANRZARVH19bTWbdbSl-z6zPmeVyj77QuDYd_yQVM" alt="" width="563"><figcaption></figcaption></figure>

You can click each reference and get to the full code that was induced in the chat context. \\


# Writing prompts

Tabnine AI code assistant: Writing prompts

## How to write the most effective prompts in Tabnine Chat

* Don't ask for multiple tasks at once.
* Plan your task step by step.
* For each step, be as specific and detailed as you can.
* Write clear, well-written prompts.
* Write prompts in English. You can try other languages, but English will probably return better results.
* Select the most relevant context: Select or mention the most relevant function or block of code.

You can try and type anything you want, but keep in mind that Tabnine Chat was designed to answer questions related to code. If you write good prompts, that are specific, detailed, and to the point, you increase the chances of getting an accurate and useful result.

Learn more on the [Tabnine Chat context](/main/getting-started/tabnine-chat/chat-context/context-context-window) and [prompt engineering](/main/getting-started/tabnine-chat/prompt).

**Example 1: Sort a list of words**

* `sort words`\ <mark style="color:red;">This is too generic</mark>
* `write a method that sorts a list of Strings`\ <mark style="color:yellow;">This is ok</mark>
* `write a function that gets a list of Strings as an input and returns that list of Strings ordered by Strings lengths and then alphabetically`\ <mark style="color:green;">This is great</mark>

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-651f2d10aaf32eef8b9471d1e5e8f8027862d31f%2F4.webp?alt=media" alt=""><figcaption></figcaption></figure>

**Example 2: Refactor to meaningful variable names**

* `refactor this code`\ <mark style="color:red;">This is too generic</mark>
* `change var names`\ <mark style="color:yellow;">This is not explicit enough</mark>
* `how would you improve the variable names in this code?`\ <mark style="color:green;">This is great</mark>

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-48ad3b4e652011dc0e35341b186d6c10365f9ead%2Fp2.webp?alt=media" alt=""><figcaption></figcaption></figure>


# Chat Context


# Understanding Context

Tabnine AI code assistant: Understanding context

Each interaction with Tabnine Chat is essentially a question or an instruction to perform a code-related task.

The basic cycle of the chat sequence is a chain of questions and answers:

* The user asks a question.
* Tabnine returns an answer.

However, the question (or prompt) that you ask is just one part of the equation. There's also the context — the extra layer of information that accompanies your question. This context is provided to the Tabnine model alongside your explicit question, enabling it to deliver more accurate and relevant responses.

Understanding the context can help you get the most out of Tabnine.

### Context used by the Tabnine Chat

The context (or context window) includes the following elements:

1. User questions or instructions
2. Selected block of code from the current file (or the cursor location)
3. Current open file
4. Chat history from the current conversation, including all the previous questions and answers (Note: Chat history isn't shared between different conversations)
5. Relevant files or code blocks from the current user workspace (if Tabnine finds such relevant files)

### Context size limit and priorities

The size of the context window is limited. Tabnine applies all kinds of algorithms and heuristics to pick and prioritize the most relevant parts of the context for each situation.

However, the most important part of the context, besides the question, is the selected code and the open file, especially the areas right above the cursor or the selected block.


# Context Scoping

Determining which specific resources Tabnine uses to adjust its answers

Context Scoping is a mechanism that explicitly shows the user the scope in which Tabnine searches for relevant context.

### What is Context Scoping?

Tabnine Chat searches for additional relevant context beyond the user's prompt to help answer questions more effectively. The relevant context can be found in various sources:

* The current open file
* The current conversation history
* The local workspace in the IDE
* Connected remote repositories from the organization's codebase (Enterprise only)

**Context Scoping** is a mechanism that explicitly shows the user the scope in which Tabnine searches for relevant context. It allows users to refine the scope, guiding Tabnine on where to look or where not to look for context.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-5b3704ffb7bec2b7f7907ccdcda75a444f153c93%2FScoping.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

### Why is this important?

The additional relevant context is passed to the AI model, directly affecting the accuracy of the Chat answer. In some cases, the most relevant context was not added, and the answers were not as accurate as expected. This can happen due to various reasons; the most common ones are that there is too much code to look in or similar content that "hides" the actually relevant context. Scoping allows users to direct Tabnine's focus on relevant areas, improving the results.

For example, by default Tabnine prefers the context from the current files and local workspaces, as it usually provides the most relevant context. However, for some questions the most relevant context is actually in a remote repository. The user can change the context scope to a remote codebase or specific remote repository, resulting in more accurate answers.

### Working with Context Scoping

The chat context scoping is managed for each chat conversation. The state of the context scoping of the conversation appears in a dedicated section next to the user prompt. Each type of scope is indicated with the relevant tag representing that scope. Tabnine will only search for relevant context in the existing context scoping.

### Types of Scoping

#### High-Level Scopes

* **Current file**: Tabnine can take the context from the current open file, if an open file exists. If this scope is not selected, Tabnine will ignore the current file.
* **Remote Codebase**: Tabnine can look for relevant context in all the remote repositories connected to the account from the codebase. If this scope is not selected, Tabnine will not look for relevant context in the connected repositories.

{% hint style="info" %}
**Unindexed Files:**<br>

You can also refer to the following filetypes with the following extensions via Context Scoping: `.md, .mkd, .mdwn, .mdown, .mdtxt, .mdtext, .markdown, .yaml, .yml, .json, .xml, .gradle, bash, .sh, .txt, .ini, .properties, .prefs, .cfg, .cmake`
{% endhint %}

#### Specific Scopes

* **Remote repository**: Indicates a specific remote repository from the codebase which is connected to the account.
* Folders and files from remote repositories in the codebase
* Folders from the local workspace

### Managing and Adjusting Context Scoping

Context scoping is defined at the Chat conversation level.

Each conversation maintains a separate scoping status. Each conversation starts with the default scoping, and the user can change the scoping by adding and removing scope.

#### Scoping State

The following three options comprise the default scoping state:

* Current file
* Local workspace
* Remote codebase (Enterprise only, if the account has connected repositories)

The default scoping appears when starting a new conversation or when resetting the scope, ensuring that Tabnine searches for context using the initial settings before any customizations.

While not part of the default scoping state, you can also add your Terminal to your context scope. The following will show you how to modify resources in your context scope with reset, adding, and removing:

#### Resetting Scope

To reset the context scope, click the "<img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-c096be1dc324c09158177ddb47f02c6d57381754%2Ficon%3Dhisrory.svg?alt=media" alt="" data-size="line"> **Reset scope"** option in the input window:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-12d5574e150a316167906cc3d09f685cd2f7b63b%2FReset%20scope.gif?alt=media" alt=""><figcaption><p>Resetting scope in Tabnine</p></figcaption></figure>

#### Adding More Scope

The user can add more scope by clicking the "+ **Add scope**" option and choosing the scope to add.

High-level scope can be added by checking the high-level option in the **Add context scope** menu.

Remote repositories, remote folders, and/or remote files are added by clicking the relevant option in the menu and then select (or search) for the desired repository:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-6a06fdc8ba5fa089113bbc0a093f58df67b4c36a%2FAdd%20Remote%20Codebase.png?alt=media" alt=""><figcaption></figcaption></figure>

The Terminal is added by selecting it from the **+ Add scope** menu.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-71583d4155c1a0adbaf0bf2216bc8ed5fcb07402%2FAdd%20Terminal%20Scope.gif?alt=media" alt=""><figcaption></figcaption></figure>

#### Removing Scope

Scope can be removed by simply clicking small "x" icon on the on each scope tag.

High-level scoping can also be removed by unchecking the high-level option in the Add context scope menu.

You can also tap the "x" option inside the input menu:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-a37ac6cc21f5f5f516c9016c9a4590d54506c138%2FDelete%20Scope.gif?alt=media" alt=""><figcaption><p>Deleting context scope within the input window</p></figcaption></figure>


# Jira Connection as Context

Tabnine AI code assistant: Jira connection

## What is the Jira Connection?

Tabnine's AI Chat allows you to connect to Atlassian Jira and extend the context of your chat with Jira issues. This capability enables you to ask Tabnine chat how to implement specific Jira issues or to validate whether your implementation aligns with the requirements detailed in those Jira issues. By bringing Jira into your IDE, you can streamline your workflow and minimize context-switching between different tools.

{% hint style="info" %}
**Note**

Tabnine Enterprise customers can integrate with either[ Jira Cloud or Jira Data Center](/main/welcome/readme/integrations/atlassian-jira#supported-matrix). While the setup process differs for the Enterprise admin, the workflow and experience remain the same for end-users, as outlined on this page. **We do support multiple instances for Jira Cloud**.
{% endhint %}

## How to Use the Jira connection

### Step 1: Connect to Jira

First, you need to connect your Tabnine plugin in the IDE to your Jira account:

1. In your IDE, navigate to **Chat** **Settings.**
2. Under Settings, find the Jira section and click <mark style="background-color:green;">**Connect**</mark>**.**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-0ee02e41922711ecbec95c5b6e9f280acdc6c55c%2FJira-%20settings.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

{% hint style="info" %}
**Troubleshooting**\
If the browser doesn’t open automatically for the next step, manually paste the following URL into your browser:

`<Tabnine server URL>/app/auth/jira`\
For example: [`https://console.tabnine.com/app/auth/jira`](https://console.tabnine.com/app/auth/jira)
{% endhint %}

3. Next, authorize access to Jira. A browser window will open, directing you to your Jira account. You’ll be prompted to give Tabnine access to your Jira workspace. Click <mark style="background-color:blue;">**Accept**</mark> to confirm connecting Tabnine to your Jira workspace.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-c1f96ab90f87085d365726b8d5865ebd094f2675%2FJira%20-%20accept.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

4. After authorization, you’ll be redirected to the Tabnine web application.

   <figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-442e1fa6afedc96430afa11b2a7deb44384f42a7%2FJira%20success.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>
5. Return to your IDE. In the chat settings, you can see that Jira has been successfully connected. There will also be an option to <mark style="color:red;">Disconnect</mark>.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-a046d33a4f1f4b00c266d7374265fa41798eefe6%2FJira%20disconnect.png?alt=media" alt=""><figcaption></figcaption></figure>

#### **Demo**

{% embed url="<https://youtu.be/KuTECwe1cv8?si=TjZRtm0RYDnk9kUr>" %}

You’re now ready to start using Jira in Tabnine Chat!

### Step 2: Mentioning Jira Issues in Tabnine Chat

Once the connection is established, all the Jira issues assigned to you as an individual user are available in Tabnine. Tabnine uses the existing Jira user permissions to ensure that only the issues assigned to you are available.

You can start referencing Jira issues in your chat prompts using any of these three triggers:

1. **Jira button:** Click the Jira button ( <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-2b3f0eada1aa273584aac69b56b003f67f5ba6a8%2FJira%20icon.png?alt=media" alt="" data-size="line"> ) in Tabnine Chat.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-bb9407d2ca187c98240097de9aa0dd017ac87b6d%2FJira%20-%20jira%20cta.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

2. **Mention button:** Click the mention button ( <img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-5e91fc4af3ed25d4c926ed43ef63c7c7b33d2137%2FMention%20icon.png?alt=media" alt="" data-size="line"> ) and choose Jira from the menu.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-e0507034382f7e1dba4d2ef7da29e99b47750e0a%2FJira%20-%20menu%20CTA.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

3. **Type directly:** Manually type **`@Jira:`** in the chat prompt.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-a61834414c51431b658aecb04a60e297e48fff59%2FJira%20-%20type.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

**For all triggers:**

* You’ll see a list of assigned Jira issues ordered by the last update.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-70fabc395228d42000ad9e48bbf492241448dcfe%2FJira%20-%20show%20issues.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

* You can filter the list by typing a prefix.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-b1186e4484d14da77db9dd5c294eb2254aa8f551%2FJira%20-%20prefix.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

* **Hover for details:** See the issue title when hovering.
* **Multiple mentions:** Add more than one issue to a single prompt.

### Does the Jira connection work with any issue format?

The Jira connection is flexible and doesn’t require issues to follow a strict template, but certain formats are more effective for producing relevant results. Here are some guidelines:

**Optimized for:**

* Self-contained, smaller scope tasks
* Specific tasks that include enough detail
* Jira issues written in both formal and informal formats

**Not optimized for:**

* Large, broad issues that lack specificity
* General tasks without concrete details
* Complex, multistep tasks without clear breakdowns

#### Examples

**Not a good fit:**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-fa41cd9bf4938123ebd153f4b7a910fac46a16b4%2FJira%20bad%20example%202.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-bd7e437fac1e3b9feb62eec49b64d810b220ea6b%2FJira%20-%20bad%20example%201.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

**Yes a good fit:**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-72b57b316d18cc092c5029329e8d48707999fba7%2FJira%20good%20example%203.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-88bd78a04f8d907fa100cb9e24bd57e1850709f9%2FJira%20-%20good%20example%201.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-31fb6bd81bbaf3150c1ad2c8b0e6394ecffd66ac%2FJira%20-%20good%20example%202.png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

### Use Cases for Jira Mentions

#### Implementing a Jira Issue:

Possible prompts:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-f5a1874856998b909aaa2c77da3df045fb674805%2FJira%20implememnt%201.png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-9003e8dd286a8df8f9965b4758e83b75c256bf3f%2FJira%20apply.png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-9e8b1569fd98ec95991c73a9013e6e17f23065fe%2FImplement.png?alt=media" alt=""><figcaption></figcaption></figure>

Demo:

{% embed url="<https://youtu.be/d8i7MEdvG2U?si=W5J7uGvKMZEvTVC3>" %}

#### Code Validation:

Possible prompts:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-a70771497b38c601f1df98409f8590b4bc424526%2FJira%20review.png?alt=media" alt=""><figcaption></figcaption></figure>

Demo:

{% embed url="<https://youtu.be/Gv_M8OVNB5I?si=c67pJXa3odTiPwzM>" %}

#### Multiple Issue Mentions:

Possible prompts:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-d08cff92c8942f956ffa22b08d7d3b16c89a32c7%2Fmultiple.png?alt=media" alt=""><figcaption></figcaption></figure>


# Conversing with Tabnine Chat

Interactions with Tabnine Chat occur in conversations.

A conversation maintains the continuity of the context by using previous user prompts and chat replies as part of the context for your current prompt.

This allows the user to refine chat suggestions by providing more specific follow-up questions that leverage the previous steps.

{% hint style="info" %}
Tips:

1. Use different conversations for different topics or problems to keep the AI focused.
2. If you feel the chat answers become irrelevant after a few iterations, start a new conversation and continue your work there.
   {% endhint %}

<figure><img src="https://lh7-us.googleusercontent.com/t8uMeOM_2VcRNcrHzJgVIxpRKw9lfQmsXjYBttfTuaxpAdPrLPwYtxPI8A2X8SDg6O8nmrtBXHcxeE_AIEHSDBPxVaaEE-ZaJWVqqLonU4N0b4o5akbBuA3ybvhxiyNxC3ZvMS-nnMFiFEWfE6RLB8LsWA=s2048" alt="" width="563"><figcaption><p>The chat window toolbar</p></figcaption></figure>

### Start a new conversation

Begin a fresh conversation each time you switch topics, or if the answers you're receiving veer off course and adjusting your prompts doesn't help to realign the responses with your needs.

You can go back to the previous conversation at any time using the conversation history.

To open a new conversation, click the **New conversation** icon (<img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-5148a6158e1e12eae29b562936c9b3a8f3c9212b%2Fimage%20(47).png?alt=media" alt="" data-size="line">) in the chat window toolbar.

A new conversation window will be opened, with a clear conversation history (no previous questions or answers).

### Clear the current conversation

Sometimes you want to start a new topic or start with a fresh context and the existing questions and answers in the current conversations are no longer relevant. In this case, it makes more sense to simply clear the current conversation context and start over.

Click the **Clear conversation** icon (<img src="https://lh7-us.googleusercontent.com/uDIzbpjyvq81rJCQv6HdF_cCeHV0o2s6QO8HIVnr9fQJKZYQl63O25XlbxP-nHw-ygZegUUrskEtFbOnuXn2LEyp0K-1A5fy9jQoHyC_AarM7nSOfFI_bO4s17ubEjVirHfv7FKmPCGmGm4dcJTiQvFaOA=s2048" alt="" data-size="line">) in the chat window toolbar.

The existing questions and answers in the current conversation will be deleted, and the context of the conversation will be reset.

### Conversation history

You can always go back to previous conversations to refer to previous suggestions or to continue where you left off by viewing your conversation history.

To do this, click the **History** icon (<img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-baaab4142dbece7d2031ff58e76ed4a65081219a%2Fimage.png?alt=media" alt="" data-size="line">) in the chat window toolbar.

The **Chat history** panel will open:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-b0c38e55beba8408a9581216e45f22e06c8b8de7%2Fimage%20(4)%20(1)%20(2).png?alt=media" alt=""><figcaption></figcaption></figure>

Click on any of the conversations in the list to go back to where you stopped, with the same conversation context as before.

At any point, you can delete your entire conversation history by clicking **Clear all conversations**.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-baaab4142dbece7d2031ff58e76ed4a65081219a%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>


# Switching between chat AI models

Tabnine AI code assistant: Switching chat AI models

## Tabnine Chat users can switch between AI models

Tabnine offers proprietary models for Tabnine Chat which are private and hosted by Tabnine (**Tabnine Protected** and **Tabnine+Mistral**).

In addition, Tabnine Chat includes the option of using third-party models. The privacy policies and the protection offered by these third-party models may be different from the Tabnine models.

Different models perform differently and some models perform better in different situations.

However, each user may have different constraints for which model can be used for different use cases.

{% hint style="info" %}
**Note:**

**Tabnine Enterprise** administrators [control](/main/welcome/readme/ai-models#tabnine-users-can-choose-which-tabnine-chat-model-to-use) and specify the models that are available to their organization
{% endhint %}

[Learn more](/main/welcome/readme/ai-models)

### Tabnine gives you the insight you need to choose

Tabnine users can choose which chat model to use. This decision depends on the specific use case and constraints of each user, around these three main aspects:

* **Performance:** Does the model provide accurate, relevant results for the programming languages and frameworks I’m working in right now?
* **Privacy:** Does the model store my code or user data? Could my code or data be shared with third parties? Is my code used to train their model?
* **Protection:** What code was the model trained on? Is it all legally licensed from the author? Will I create risks for my business by accepting generated code from a model trained on unlicensed repositories?

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-88bac8f3864e47c1582d22f40df130a5eb454b18%2FScreenshot%202024-08-27%20at%2012.21.37.png?alt=media" alt=""><figcaption></figcaption></figure>

[Learn more about the chat models' availability and tradeoffs.](/main/welcome/readme/ai-models)

### Selecting and switching between chat models

In the Tabnine Chat tab, use the model selector to see the available AI models for Chat, understand the tradeoffs of privacy, protection, and performance, and choose the model that's relevant for you.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-cbd74bab540bcf32543860a7dbcdd4cd924e2d30%2Fchange%20model%20-%20raw.gif?alt=media" alt=""><figcaption></figcaption></figure>

Tabnine Chat users can select and switch between chat models in real time.

For each answer, Tabnine indicates from which model this answer was drawn.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-3e06eea6260e951c26c852c80910557e16c84080%2Fswitch%20models%20in%20real%20time%20raw.gif?alt=media" alt=""><figcaption></figcaption></figure>


# Image Prompts

This documentation will show you how to use image prompts in Tabnine, along with examples.

In addition to written prompts, you can add an image to the context Tabnine Chat uses to produce results, otherwise known as Visual-to-Code.

{% hint style="info" %}
To use image prompts in Tabnine, you need to use one of the following models: Claude 3.5 Sonnet (both V1 and V2), Claude 3.7 Sonnet, and ChatGPT 4o. The allowed types of files are .png, .jpg, and .jpeg (the file can be up to 5 MB)
{% endhint %}

### Adding Image Prompts

Visual-to-Code has three options to get the image into the input field:

1. Click on the upload icon and select from the right location
2. Drag and drop the image into the window.
3. Cut/Copy and paste the image directly into the window.

In this example, a user copies a generic image of an app and pastes it into Tabnine in order to create code that would mimic the fictional app:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-a64b5d36008d4c4d242ad217be24ac5c858bac5e%2FImage%20Prompt%20Copy%20Paste%20UI.gif?alt=media" alt=""><figcaption><p>Copying and pasting an image prompt into Tabnine, then asking for code</p></figcaption></figure>

In a second example, a user uploads an image and requests Tabnine use it as a template for a cover letter:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-08630bbd7d3aa57caf25e60fa15ef4abad06fad0%2FTabnine%20Docs%20videos.gif?alt=media" alt=""><figcaption><p>Uploading an image, then asking Tabnine to mimic the formatting in the image</p></figcaption></figure>

From there, you will be able to see thumbnails of all the uploaded images next to the text input window. Clicking on a thumbnail will display the image in a larger preview window.

Tabnine will immediately add any and all uploaded images into the context it considers for generating responses.

### Activating Image Prompts

If your image icon is inactive, open a new chat and select either Claude 3.5 Sonnet or ChatGPT 4o in order to activate image prompting:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-427e504964a788dce87f327b907cd570f3a956f2%2FImage%20prompt.gif?alt=media" alt=""><figcaption></figcaption></figure>

\\


# \*Upgraded Chat (v6.2.0)

Describing the updates to Tabnine Chat with v6.2.0

### Overview: Unified Experience

On [v6.2.0](https://docs.tabnine.com/main/getting-started/tabnine-chat/pages/risy3bTOlfBfgFRRXK8K#v6.2.0), Tabnine has upgraded Chat for a fuller conversational experience. This upgrade simplifies the architecture and delivers a more consistent user experience.\
Tabnine chat will now be powered by the same strong agentic agent, allowing multiple-shot answers and tool utilization.

The chat mode will run read-only tools.

In addition, Chat will get its own dedicated Chat Usage page under the Analytics tab in the Tabnine Admin Console.

### What's Changing

#### **Inherited Capabilities**

Chat now runs on an advanced backend. This includes the following key features now being available in Chat:

* Apply All
* Scoping chips
* Custom commands
* Attribution for code blocks

#### **Chat Mode Configuration**

Chat Mode is designed to be a fast Q\&A experience with the following configurations:

* **Limited Turns**: Chat conversations are capped at 5–15 turns, focused on read operations.
* **Read-Only Tools**: In Chat mode, only read tools are provided to the LLM, but not write actions.
* **No MCP access**: Chat mode does not include MCP server access, which these remain exclusive to Agent mode.

{% hint style="info" %}
Tabnine doesn’t charge customers for chat mode token consumption, either in the old version or the new one.
{% endhint %}


# Tabnine CLI

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

Tabnine CLI is your AI-powered coding assistant in the terminal.

{% hint style="warning" %}
**Prerequisite:** Tabnine CLI requires **Tabnine Agents** to be enabled for your team. Ask your admin to enable Agents in the Admin Console.
{% endhint %}

{% hint style="info" %}
Installed the Tabnine plugin for OpenCode? That installer reassigns the `tabnine` command to the newer, opencode-based CLI and renames this one to `tabnine-legacy`. Every command on this page then applies unchanged under `tabnine-legacy`. See [Install](/main/getting-started/tabnine-plugin-for-opencode/install).
{% endhint %}

### 🚀 Quick Start

**New to Tabnine CLI?** Start here:

{% stepper %}
{% step %}
[Installation](/main/getting-started/tabnine-cli/getting-started/installation) - Install Tabnine CLI
{% endstep %}

{% step %}
[Quick Start Guide](/main/getting-started/tabnine-cli/getting-started/quickstart) - Get started in 5 minutes
{% endstep %}

{% step %}
[Overview](/main/getting-started/tabnine-cli/getting-started#what-is-tabnine-cli) - What is Tabnine CLI?
{% endstep %}
{% endstepper %}

### Common Tasks

I want to...

* **Get started quickly** → [Quick Start Guide](/main/getting-started/tabnine-cli/getting-started/quickstart)
* **Search large codebases** → [Remote Code Search](https://docs.tabnine.com/main/getting-started/tabnine-cli/examples/code-review#using-remote-code-search)
* **Get coding best practices** → [Coaching Guidelines](/main/administering-tabnine/managing-your-team/context-engine/coaching-guidelines-v)
* **Review my code** → [Code Review Example](/main/getting-started/tabnine-cli/examples/code-review)
* **Troubleshoot issues** → [FAQ](/main/getting-started/tabnine-cli/troubleshooting/faq)

### Getting Help

{% hint style="info" %}

* In Tabnine CLI: Type `/help` for commands and keyboard shortcuts
* Common Questions: Check the [FAQ](/main/getting-started/tabnine-cli/troubleshooting/faq)
* Having Issues: See [Common Issues](/main/getting-started/tabnine-cli/troubleshooting/common-issues)
* Report Problems: Use the `/bug` command in Tabnine CLI
  {% endhint %}


# Getting Started

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

### What is Tabnine CLI?

Tabnine CLI is an AI-powered coding assistant that runs directly in your terminal. It combines advanced AI models with intelligent code understanding to help you write, understand, and improve code faster.

### What Can Tabnine CLI Do?

#### 💬 Interactive Conversations

Ask questions and get intelligent answers about your code:

```
> What does this function do in @src/auth.ts?

> How can I improve the error handling in @utils/validator.js?

> Explain the authentication flow in this codebase
```

#### 📝 Code Analysis and Review

Get comprehensive code reviews with actionable feedback:

```
> Review @src/api/users.ts and suggest improvements

> Check @src/services/ for security vulnerabilities

> Analyze the performance of @database/queries.ts
```

#### ✍️ Code Generation and Editing

Generate new code or modify existing files:

```
> Create a REST API endpoint for user registration

> Add error handling to all functions in @src/utils/

> Refactor @src/payment.ts to use async/await
```

#### 🔍 Powerful Code Search

**Remote Code Search** - Search across massive codebases:

```
> Find all functions that handle authentication

> Where is the database connection configured?

> Show all API endpoints that use JWT tokens
```

#### 🎓 Learn Best Practices

**Coaching Guidelines** - Get AI-powered guidance:

```
> What are the best practices for error handling in Node.js?

> How should I structure my API endpoints?

> Review my code against security best practices
```

#### 🛠️ File Operations

Work with files naturally:

```
> Read @package.json and list the main dependencies

> Create a new file README.md with project documentation

> Search for "TODO" comments in @src/
```

### Key Features

#### Terminal-Native Experience

* **Interactive Mode**: Full-featured chat interface
* **Non-Interactive Mode**: Perfect for scripts and automation
* **Keyboard Shortcuts**: Efficient navigation
* **Rich Output**: Syntax highlighting and formatted code

#### Smart Context Understanding

Tabnine CLI automatically understands your:

* **Current working directory**
* **File structure**
* **Code conventions**
* **Project context**

#### Powerful Built-in Tools

* **File Operations** - Read, write, search files
* **Shell Commands** - Execute commands safely
* **Remote Code Search** - Search large codebases using cloud indexing
* **Coaching Guidelines** - AI-powered best practices
* **Code Analysis** - Deep understanding of your code

#### Enterprise-Ready

* **Proxy Support** - Works behind corporate firewalls
* **Custom Certificates** - Supports custom CA certificates
* **Secure Authentication** - OAuth-based authentication
* **Privacy** - Your code stays secure

### How It Works

```
┌─────────────────┐
│  You ask a      │
│  question       │
└────────┬────────┘
         ↓
┌─────────────────┐
│  Tabnine CLI    │
│  gathers context│
└────────┬────────┘
         ↓
┌─────────────────┐
│  AI analyzes    │
│  with context   │
└────────┬────────┘
         ↓
┌─────────────────┐
│  Tools execute  │
│  as needed      │
└────────┬────────┘
         ↓
┌─────────────────┐
│  Results shown  │
│  in terminal    │
└─────────────────┘
```

### Common Use Cases

#### Development Workflow

**Code Review**

```
> Review the changes in @src/auth.ts and suggest improvements
```

**Bug Fixing**

```
> I'm getting a TypeError in @src/server.ts line 45. Help me fix it
```

**Refactoring**

```
> Refactor @src/utils.ts to be more maintainable
```

**Documentation**

```
> Generate JSDoc comments for all functions in @src/api/
```

#### Learning and Exploration

**Understand Code**

```
> Explain how the authentication system works in this project
```

**Learn Patterns**

```
> Show me the best way to implement pagination in REST APIs
```

**Troubleshoot**

```
> Why am I getting a CORS error when calling the API?
```

#### Automation

**CI/CD Integration**

```bash
tabnine -p "Review the code changes" --output-format json
```

**Batch Processing**

```bash
tabnine -p "Add type annotations to all TypeScript files in src/"
```

### Interface Overview

When you start Tabnine CLI, you'll see:

```
┌─────────────────────────────────────────────┐
│  Tabnine CLI                                │  ← Header
│  Model: gpt-4o | Dir: /my/project           │
├─────────────────────────────────────────────┤
│                                             │
│  AI: How can I help you today?              │  ← Conversation
│                                             │
│  You: What files are in this directory?     │
│                                             │
│  AI: [Using list_directory tool...]         │
│  The current directory contains...          │
│                                             │
├─────────────────────────────────────────────┤
│  > █                                        │  ← Input
├─────────────────────────────────────────────┤
│  Type /help for commands                    │  ← Footer
└─────────────────────────────────────────────┘
```

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FU04i5mrHYzNrAsmDdODZ%2FTabnine%20CLI%20screen%201.png?alt=media&amp;token=c224a586-4e4b-473f-98a3-db8f99912ae3" alt=""><figcaption><p>This screenshot shows the header, conversation area, input area, and footer</p></figcaption></figure>


# Installation

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

Install Tabnine CLI on your system.

{% hint style="info" %}
Installed the Tabnine plugin for OpenCode? That installer reassigns the `tabnine` command to the newer, opencode-based CLI and renames this one to `tabnine-legacy`. Every command on this page then applies unchanged under `tabnine-legacy`. See [Install](/main/getting-started/tabnine-plugin-for-opencode/install).
{% endhint %}

### Prerequisites

* **Node.js** version **22** or higher
* Access to a tabnine host
* Tabnine Agents enabled for your team

### Download and Install

Run the appropriate command for your platform. Replace `<YOUR TABNINE HOST>` with the URL of your tabnine console (For example: <https://console.tabnine.com>):

#### macOS, Linux, WSL

```bash
export TABNINE_HOST="<YOUR TABNINE HOST>"
curl $TABNINE_HOST/update/cli/installer.mjs | node --input-type=module - $TABNINE_HOST
```

#### Windows PowerShell

```powershell
$env:TABNINE_HOST = "<YOUR TABNINE HOST>"
irm $env:TABNINE_HOST/update/cli/installer.mjs | node --input-type=module - $env:TABNINE_HOST
```

#### Windows CMD

```cmd
set TABNINE_HOST="<YOUR TABNINE HOST>"
curl %TABNINE_HOST%/update/cli/installer.mjs | node --input-type=module - %TABNINE_HOST%
```

### Add to PATH

After installation, add Tabnine CLI to your PATH.

#### macOS, Linux, WSL

The default installation location is:

```
~/.local/bin/tabnine  # or tabnine-legacy if you installed tabnine-opencode
```

**Note**: `~/.local/` is different than `/local/`. If you don't have a `~/.local/` folder, create it first:

```bash
mkdir -p ~/.local/bin
```

Add to your PATH by adding this line to your shell configuration file (`~/.bashrc`, `~/.zshrc`, etc.):

```bash
export PATH="$HOME/.local/bin:$PATH"
```

Then reload your shell configuration:

```bash
source ~/.bashrc  # or source ~/.zshrc
```

#### Windows

The installer should add Tabnine CLI to your PATH automatically. If not, add the installation directory manually:

{% stepper %}
{% step %}
**Open System Properties**

Open **System Properties** → **Environment Variables**.
{% endstep %}

{% step %}
**Edit User Path**

Under **User variables**, select **Path** and click **Edit**.
{% endstep %}

{% step %}
**Add Directory**

Add the Tabnine CLI installation directory.
{% endstep %}

{% step %}
**Save**

Click **OK** to save.
{% endstep %}
{% endstepper %}

### Verify Installation

Check that Tabnine CLI is correctly installed:

```bash
tabnine --version
```

You should see the version number displayed.

### First Run

Start Tabnine CLI:

```bash
tabnine
```

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2F4MrGR8xawkOov9vOrdhS%2Ftabnine%20CLI%20open.gif?alt=media&amp;token=4fb24c4b-5824-4434-b610-26b9f3ff268d" alt=""><figcaption></figcaption></figure>

#### Authentication

On first run, you'll be prompted to sign in to Tabnine:

{% stepper %}
{% step %}
Press **OK** when prompted for authentication.
{% endstep %}

{% step %}
Your browser will open to `tabnine.com`.
{% endstep %}

{% step %}
If you're already signed in, authentication will be automatic.
{% endstep %}

{% step %}
If not, log in with your Tabnine credentials.
{% endstep %}

{% step %}
Return to the terminal - you're ready to use Tabnine CLI!
{% endstep %}
{% endstepper %}

### Troubleshooting

<details>

<summary>"Command not found: tabnine"</summary>

Solution: Ensure Tabnine CLI is in your PATH:

```bash
# Check if the binary exists
ls ~/.local/bin/tabnine

# Verify PATH includes the directory
echo $PATH | grep ".local/bin"

# If not in PATH, add it (see "Add to PATH" section above)
```

</details>

<details>

<summary>"Node.js not found"</summary>

Solution: Install Node.js version 22 or higher from [nodejs.org](https://nodejs.org/)

</details>

<details>

<summary>Installation Fails</summary>

Common causes:

* No access to tabnine host
* Node.js version too old
* Insufficient permissions

Solutions:

* Check network connection
* Update Node.js: `node --version` (should be 22+)
* On Unix systems, ensure `~/.local/bin` has write permissions

</details>

<details>

<summary>Authentication Fails</summary>

Solution: See the [Troubleshooting](/main/getting-started/tabnine-cli/troubleshooting) section.

</details>

### Updating Tabnine CLI

Tabnine CLI checks for updates automatically. To manually update, re-run the installer according to the [installation instructions](#download-and-install).

Sometimes, you will be prompted to restart Tabnine CLI following an update. This will typically happen at the beginning of a session, as seen here:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FZJvHY1XPKRRFmNqpzIVA%2FUpdate%20rerun%20tabnine.png?alt=media&amp;token=9c4fbcf2-0517-46c2-afe2-4cb213fffcce" alt=""><figcaption><p>You may be asked to re-run Tabnine after an update</p></figcaption></figure>

### Uninstall

To remove Tabnine CLI:

#### macOS, Linux, WSL

```bash
rm -rf ~/.tabnine/agent
rm ~/.local/bin/tabnine # or tabnine-legacy if you installed Tabnine-opencode
```

#### Windows

```powershell
Remove-Item -Recurse -Force $env:USERPROFILE\.tabnine\agent

# Remove tabnine.exe from installation directory
```

Then remove the installation directory from your PATH.


# Quickstart

Get started with Tabnine CLI in 5 minutes!

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

Before you begin, make sure you have Tabnine CLI installed:

[**Installation Guide**](/main/getting-started/tabnine-cli/getting-started/installation) - Install Tabnine CLI on your system

If you've already installed Tabnine CLI, you're ready to go!

***

### Step 1: Start Tabnine CLI

Open your terminal and start Tabnine CLI:

```bash
tabnine
```

### Step 2: Authenticate

On first run, you may be prompted to authenticate. Follow the on-screen instructions to log in with your Tabnine account.

### Step 3: Your First Conversation

Once authenticated, you're ready to use Tabnine CLI!

#### Example 1: Ask a Question

```
> What is Tabnine CLI and how can it help me?
```

The AI will explain Tabnine CLI's capabilities.

#### Example 2: List Files

```
> What files are in the current directory?
```

Tabnine CLI will show you the directory structure.

#### Example 3: Read and Explain Code

```
> Read the package.json file and explain what this project does
```

The AI will read the file and provide an analysis.

#### Example 4: Write Code

```
> Create a simple Node.js HTTP server that responds with "Hello World"
```

Tabnine CLI will generate the code and can write it to a file if you confirm.

### Essential Commands

Tabnine CLI has built-in slash commands. Here are the most useful:

#### Get Help

```
> /help
```

Shows all available commands and keyboard shortcuts.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FgINXnA8aTxJs3ZJ3xU6v%2Fslash%20help%20command.gif?alt=media&amp;token=51661a42-6a47-4622-9a32-dd0aafe07269" alt=""><figcaption></figcaption></figure>

#### Change Model

```
> /model
```

Opens a dialog to select a different AI model.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FLvVu1xglINWeShUX0ssl%2Fslash%20model%20command.gif?alt=media&amp;token=15995cf4-bc40-401c-b0dc-4cc7b7a584ee" alt=""><figcaption></figcaption></figure>

#### Clear Conversation

```
> /clear
```

Clears the current conversation history.

#### View Settings

```
> /settings
```

Opens the settings dialog to configure Tabnine CLI.

#### Exit

Press `Ctrl+C` or type:

```
> /quit
```

### Working with Files

#### Read Files

Reference files using the `@` symbol:

```
> Explain what @src/index.ts does
```

The AI will automatically read and analyze the file.

#### Edit Files

```
> In @src/index.ts, add error handling to the main function
```

The AI will propose changes and ask for confirmation before modifying the file.

#### Create Files

```
> Create a new file README.md with documentation for this project
```

The AI will generate content and create the file (with your confirmation).

#### Search Files

```
> Find all TODO comments in @src/
```

The AI will search through your files.

### Using for Different Tasks

#### Code Review

```
> Review @src/auth.ts and suggest improvements
```

Get AI-powered feedback on your code.

#### Bug Fixing

```
> I'm getting a TypeError in @src/server.ts line 45. Help me fix it
```

Get help debugging issues.

#### Documentation

```
> Generate JSDoc comments for all functions in @src/utils.ts
```

Automatically create documentation.

#### Learning

```
> Explain how the authentication system works in this project
```

Understand your codebase better.

### Keyboard Shortcuts

Master these shortcuts for efficiency:

| Shortcut  | Action              |
| --------- | ------------------- |
| `Ctrl+C`  | Exit Tabnine CLI    |
| `Ctrl+L`  | Clear screen        |
| `↑` / `↓` | Navigate history    |
| `Ctrl+U`  | Clear current input |

Type `/help` to see all shortcuts.

### Non-Interactive Mode

For scripts and automation, use non-interactive mode:

{% hint style="info" %}
Non-interactive mode still requires authentication.

* Set `TABNINE_TOKEN` environment variable to a [Personal Access Token](/main/administering-tabnine/managing-your-team/settings/access-tokens) generated in the Tabnine admin console.
* Or sign in once in interactive mode (`tabnine`) and authenticate with Tabnine using the OAuth flow.

If both are present, `TABNINE_TOKEN` takes precedence.
{% endhint %}

```bash
# Simple text output
tabnine -p "What are the main dependencies in package.json?"

# JSON output (for parsing)
tabnine -p "Analyze the project structure" --output-format json

# Process a file
cat myfile.js | tabnine -p "Review this code for security issues"
```

### Pro Tips

#### Be Specific

❌ "Review my code"\
✅ "Review @src/auth.ts for security vulnerabilities and error handling"

#### Use Context

Add project context with a `TABNINE.md` file in your project root:

```markdown
# Project Context

This is a TypeScript Node.js project for building web APIs.

## Key Conventions
- Use async/await for asynchronous code
- Add JSDoc comments to all exported functions
- Write unit tests in __tests__/ directories
```

#### Chain Tasks

```
> First, run the tests with `npm test`. If they pass, commit the changes with message "Add feature X"
```

#### Use Remote Code Search

```
> Using Remote Code Search, find all functions that handle user authentication
```

#### Get Coaching

```
> Based on coding best practices, review @src/api/ and suggest improvements
```

### Common Workflows

#### Morning Code Review

```
> Review the changes I made yesterday in @src/
```

#### Before Committing

```
> Check @src/ for:
> - Security issues
> - Missing error handling  
> - Code quality problems
```

#### Learning New Code

```
> I'm new to this codebase. Explain the overall architecture and where I should start
```

#### Refactoring

```
> Suggest refactoring opportunities in @src/services/ to improve maintainability
```

### Troubleshooting

#### Slow Response

If responses are slow:

1. Check your network connection
2. Try a different model with `/model`
3. Be more specific in your prompts
4. See [Troubleshooting Guide](/main/getting-started/tabnine-cli/troubleshooting/common-issues)

#### Command Not Found

If you see "command not found: tabnine":

1. Verify Tabnine CLI is installed - see [**Installation Guide**](/main/getting-started/tabnine-cli/getting-started/installation)
2. Check your PATH configuration
3. Try running with full path: `~/.local/bin/tabnine` (Linux/macOS)

### Next Steps

Now that you're familiar with the basics:

#### Learn More

* [**Installation Guide**](/main/getting-started/tabnine-cli/getting-started/installation) - Installation and setup reference
* [**Commands Reference**](/main/getting-started/tabnine-cli/features/commands) - All available commands
* [**Keyboard Shortcuts**](/main/getting-started/tabnine-cli/features/keyboard-shortcuts) - Productivity tips
* [**Settings**](broken://spaces/Y2qxVf5VTm3fmwP4B4Gx/pages/3fe53bae5fd7e1f94f87a74a12bc594846e75312) - Configure Tabnine CLI

#### Explore Powerful Features

* [**Remote Code Search**](/main/administering-tabnine/managing-your-team/context-engine) - Search large codebases
* [**Coaching Guidelines** ](/main/administering-tabnine/managing-your-team/context-engine/coaching-guidelines-v)- Get best practices
* [**Built-in Tools**](/main/getting-started/tabnine-cli/features/built-in-tools) - What tools are available
* [**Checkpointing**](/main/getting-started/tabnine-cli/features/checkpointing) - Undo file changes

#### See Real Examples

* [**Code Review**](/main/getting-started/tabnine-cli/examples/code-review) - Comprehensive review workflows

#### Get Help

* [**FAQ**](/main/getting-started/tabnine-cli/troubleshooting/faq) - Common questions
* [**Troubleshooting**](/main/getting-started/tabnine-cli/troubleshooting/common-issues) - Solve problems
* **In-App Help**: Type `/help` anytime

### Practice Exercise

{% stepper %}
{% step %}
**Start Tabnine CLI**

Start the CLI:

`tabnine`
{% endstep %}

{% step %}
**List files**

Ask:

`What files are in this directory?`
{% endstep %}

{% step %}
**Read a file**

Ask:

`Explain what @package.json contains`
{% endstep %}

{% step %}
**Get help**

Type:

`/help`
{% endstep %}

{% step %}
**Change model**

Type:

`/model` and explore options
{% endstep %}

{% step %}
**Ask about code**

Ask:

`What are the best practices for error handling?`
{% endstep %}
{% endstepper %}

Congratulations! You're now ready to use Tabnine CLI effectively. Happy coding! 🎉


# Features

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}


# Settings

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

Tabnine CLI provides a comprehensive settings system that allows you to customize the agent's behavior, appearance, and security posture. You can configure settings through two methods:

* **Interactive settings command** — Type `/settings` in the chat to open a searchable settings editor
* **Manual file editing** — Edit the settings JSON files directly (see [Settings files](#settings-files) below)

For the complete list of all available settings, see [Settings Reference](/main/getting-started/tabnine-cli/features/settings/settings-reference).

## Settings files

Tabnine CLI loads settings from multiple files, merged in the following order (highest number wins):

| # | Level               | Path                                     | Purpose                                            |
| - | ------------------- | ---------------------------------------- | -------------------------------------------------- |
| 1 | **System Defaults** | `<system-defaults-path>`                 | Organization-wide defaults that users can override |
| 2 | **User**            | `~/.tabnine/agent/settings.json`         | Personal defaults across all projects              |
| 3 | **Workspace**       | `<project>/.tabnine/agent/settings.json` | Project-specific overrides                         |
| 4 | **System**          | `<system-settings-path>`                 | Admin-enforced overrides (highest priority)        |

{% hint style="info" %}
**System Defaults** vs **System Settings:** System Defaults provide organization-wide baseline configuration that individual users can override with their own settings. System Settings have the **highest priority** and override everything — use them for admin-enforced policies that users cannot change.
{% endhint %}

**System file paths by platform:**

| Platform    | System Settings                                         | System Defaults                                                |
| ----------- | ------------------------------------------------------- | -------------------------------------------------------------- |
| **Windows** | `C:\ProgramData\tabnine-cli\settings.json`              | `C:\ProgramData\tabnine-cli\system-defaults.json`              |
| **macOS**   | `/Library/Application Support/TabnineCli/settings.json` | `/Library/Application Support/TabnineCli/system-defaults.json` |
| **Linux**   | `/etc/tabnine-cli/settings.json`                        | `/etc/tabnine-cli/system-defaults.json`                        |

System file paths can be overridden with the `TABNINE_CLI_SYSTEM_SETTINGS_PATH` and `TABNINE_CLI_SYSTEM_DEFAULTS_PATH` environment variables.

{% hint style="info" %}
All settings files use the same JSON format. Workspace settings from untrusted folders are ignored.
{% endhint %}

{% hint style="warning" %}
Changes made via `/settings` take effect immediately. Manual edits to the JSON files require restarting the CLI. Some settings always require a restart regardless of how they are changed — see the [Settings Reference](/main/getting-started/tabnine-cli/features/settings/settings-reference) for details.
{% endhint %}

## Core settings

### Approval mode

Controls whether the agent asks for confirmation before running shell commands and making file changes.

| Value       | Description                                                  |
| ----------- | ------------------------------------------------------------ |
| `default`   | Always ask for confirmation (default)                        |
| `auto_edit` | Auto-approve file edit tools; ask for shell commands         |
| `plan`      | Read-only mode — the agent can only read and plan, not write |

**Key:** `general.defaultApprovalMode`

```json
{
  "general": {
    "defaultApprovalMode": "auto_edit"
  }
}
```

{% hint style="danger" %}
**YOLO mode** (auto-approve everything) can only be enabled via the command line with `--yolo` or `--approval-mode=yolo`. It cannot be set in the settings file. To block YOLO mode entirely (even from the command line), set `security.disableYoloMode` to `true`.
{% endhint %}

### Theme

Controls the visual theme of the CLI interface. See [Themes](/main/getting-started/tabnine-cli/features/themes) for the full list and customization options.

**Key:** `ui.theme`

Built-in dark themes: `Default`, `Atom One`, `Ayu`, `Dracula`, `GitHub`, `Holiday`, `Shades Of Purple`, `Solarized Dark`, `ANSI`

Built-in light themes: `Default Light`, `Ayu Light`, `GitHub Light`, `Google Code`, `Solarized Light`, `Xcode`, `ANSI Light`

```json
{
  "ui": {
    "theme": "Dracula"
  }
}
```

When no theme is explicitly set, the CLI automatically switches between `Default` (dark) and `Default Light` based on your terminal background color. Disable this with `ui.autoThemeSwitching: false`.

### Model

Override the model used for conversations. You can also switch models during a session with the `/model` command or the `-m` CLI flag. To see how more details and how to configure Fast Models, see [Model Selection](/main/getting-started/tabnine-cli/features/model-selection).

**Key:** `model.name`

```json
{
  "model": {
    "name": "your-model-identifier"
  }
}
```

### MCP servers

Configure external [MCP (Model Context Protocol)](https://modelcontextprotocol.io/) servers to extend the agent with additional tools and context sources. See [MCP Server Config](/main/getting-started/tabnine-agent/mcp-intro-and-setup/mcp-server-config) for full details.

**Key:** `mcpServers`

```json
{
  "mcpServers": {
    "my-server": {
      "command": "npx",
      "args": ["-y", "@my-org/mcp-server"],
      "env": {
        "API_KEY": "your-api-key"
      }
    }
  }
}
```

{% hint style="info" %}
MCP server changes always require restarting the CLI.
{% endhint %}

### Telemetry

Telemetry is configured as an object.

See [Telemetry](/main/getting-started/tabnine-cli/features/telemetry) for collection behavior and configuration details.

**Key:** `telemetry`

```json
{
  "telemetry": {
    "enabled": false
  }
}
```

## Full example

A settings file showing commonly customized options:

```json
{
  "general": {
    "defaultApprovalMode": "auto_edit",
    "vimMode": false,
    "tabnineHost": "https://console.tabnine.com"
  },
  "ui": {
    "theme": "Dracula",
    "autoThemeSwitching": false,
    "showLineNumbers": true,
    "inlineThinkingMode": "full"
  },
  "model": {
    "name": "your-model-identifier",
    "compressionThreshold": 0.7
  },
  "tools": {
    "enableWebFetchTool": true,
    "enableRemoteCodeSearch": true
  },
  "security": {
    "enablePermanentToolApproval": true
  },
  "telemetry": {
    "enabled": true
  },
  "mcpServers": {}
}
```

## Related

* [Settings Reference](/main/getting-started/tabnine-cli/features/settings/settings-reference) — Complete list of all settings
* [Themes](/main/getting-started/tabnine-cli/features/themes) — Visual themes and custom theme creation
* [MCP Server Config](/main/getting-started/tabnine-agent/mcp-intro-and-setup/mcp-server-config) — Detailed MCP server setup
* [Hooks](/main/getting-started/tabnine-cli/features/hooks) — Automate workflows with hooks
* [Keyboard Shortcuts](/main/getting-started/tabnine-cli/features/keyboard-shortcuts) — All available keybindings
* [Commands](/main/getting-started/tabnine-cli/features/commands) — Command-line flags and options


# Settings Reference

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

Complete reference of all Tabnine CLI settings. For an overview and getting started guide, see [Settings](/main/getting-started/tabnine-cli/features/settings).

Settings are read from `settings.json` files in order of precedence (highest first):

1. **System Settings:** Platform-specific system settings path — Admin-enforced overrides (highest priority)
2. **Workspace:** `<project>/.tabnine/agent/settings.json` — Project-specific overrides
3. **User:** `~/.tabnine/agent/settings.json` — Personal defaults across all projects
4. **System Defaults:** Platform-specific system defaults path — Organization-wide defaults that users can override (lowest priority)

Settings are deep-merged — you only need to specify overrides. System file paths vary by platform and can be overridden with `TABNINE_CLI_SYSTEM_SETTINGS_PATH` and `TABNINE_CLI_SYSTEM_DEFAULTS_PATH` environment variables.

**Legend:**

* ⟳ = requires restart to take effect

**System file paths:**

| Platform    | System Settings                                         | System Defaults                                                |
| ----------- | ------------------------------------------------------- | -------------------------------------------------------------- |
| **Windows** | `C:\ProgramData\tabnine-cli\settings.json`              | `C:\ProgramData\tabnine-cli\system-defaults.json`              |
| **macOS**   | `/Library/Application Support/TabnineCli/settings.json` | `/Library/Application Support/TabnineCli/system-defaults.json` |
| **Linux**   | `/etc/tabnine-cli/settings.json`                        | `/etc/tabnine-cli/system-defaults.json`                        |

### General Settings

| Setting                         | Type    | Description                                                                                                                                                               | Default   |
| ------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- |
| `general.defaultApprovalMode`   | enum    | You can control how tool execution is approved by choosing `default` (prompts for approval), `auto_edit` (automatically approves edit tools), or `plan` (read-only mode). | `default` |
| `general.vimMode`               | boolean | You can use Vim keybindings for navigation and editing when this is enabled.                                                                                              | `false`   |
| `general.enableNotifications`   | boolean | You will receive desktop notifications for action-required prompts and session completion when this is enabled.                                                           | `false`   |
| `general.retryFetchErrors`      | boolean | The CLI will automatically retry network fetch errors when this is enabled.                                                                                               | `true`    |
| `general.maxAttempts`           | number  | You can set the maximum number of retry attempts for model requests (this cannot be set higher than 10).                                                                  | `10`      |
| `general.debugKeystrokeLogging` | boolean | Keystrokes are logged to the console for debugging purposes when this is enabled.                                                                                         | `false`   |
| `general.preferredEditor`       | string  | You can specify the editor you prefer to use for opening files.                                                                                                           | —         |
| `general.devtools`              | boolean | DevTools inspector opens on launch when this is enabled (you can access it by pressing F12).                                                                              | `false`   |
| `general.tabnineHost`           | string  | You can specify the Tabnine host URL you want to use for authentication. ⟳                                                                                                | —         |
| `general.checkpointing.enabled` | boolean | Session checkpointing is available for recovery when this is enabled. See [Checkpointing](/main/getting-started/tabnine-cli/features/checkpointing). ⟳                    | `false`   |

#### Session Retention Settings

Automatic cleanup of old chat sessions:

| Setting                                 | Type    | Description                                                                                                        | Default |
| --------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------ | ------- |
| `general.sessionRetention.enabled`      | boolean | Old chat sessions are automatically cleaned up when this is enabled.                                               | `true`  |
| `general.sessionRetention.maxAge`       | string  | Sessions older than this time period are deleted (you can use formats like `7d`, `24h`, `1w`).                     | `30d`   |
| `general.sessionRetention.maxCount`     | number  | You can specify the maximum number of sessions to keep as an alternative to `maxAge` (keeps the most recent ones). | —       |
| `general.sessionRetention.minRetention` | string  | You can set the safety minimum retention period that prevents accidental deletion of very recent sessions.         | `1d`    |

#### Plan Mode Settings

| Setting                     | Type    | Description                                                                                                         | Default |
| --------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------- | ------- |
| `general.plan.directory`    | string  | You can specify the directory where planning artifacts are stored (defaults to system temp dir if not specified). ⟳ | —       |
| `general.plan.modelRouting` | boolean | Automatically switches between Pro (planning) and Flash (implementation) models when this is enabled.               | `true`  |

### Output Settings

| Setting         | Type | Description                                                             | Default |
| --------------- | ---- | ----------------------------------------------------------------------- | ------- |
| `output.format` | enum | You can choose the format for CLI output by selecting `text` or `json`. | `text`  |

### User Interface Settings

All UI settings are nested under the `ui` key.

| Setting                                | Type    | Description                                                                                                                | Default |
| -------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------- | ------- |
| `ui.theme`                             | string  | You can specify the color theme you want to use (see [Themes](/main/getting-started/tabnine-cli/features/themes)).         | (auto)  |
| `ui.autoThemeSwitching`                | boolean | Automatically switches between light and dark themes based on your terminal background when this is enabled.               | `true`  |
| `ui.terminalBackgroundPollingInterval` | number  | You can set how often (in seconds) the CLI checks your terminal background color.                                          | `60`    |
| `ui.customThemes`                      | object  | You can define your custom theme definitions (see [Themes](/main/getting-started/tabnine-cli/features/themes) for schema). | `{}`    |
| `ui.showLineNumbers`                   | boolean | Line numbers are displayed in chat when this is enabled.                                                                   | `true`  |
| `ui.hideBanner`                        | boolean | The startup banner is hidden when this is enabled.                                                                         | `false` |
| `ui.hideTips`                          | boolean | Helpful tips are hidden when this is enabled.                                                                              | `false` |
| `ui.hideFooter`                        | boolean | The footer bar is hidden when this is enabled.                                                                             | `false` |
| `ui.showMemoryUsage`                   | boolean | Memory usage information is shown when this is enabled.                                                                    | `false` |
| `ui.showSpinner`                       | boolean | A spinner is shown during operations when this is enabled.                                                                 | `true`  |
| `ui.inlineThinkingMode`                | enum    | You can control how model thinking is displayed by choosing `off` or `full`.                                               | `off`   |
| `ui.loadingPhrases`                    | enum    | You can choose what you see while the CLI is working by selecting `tips`, `witty`, `all`, or `off`.                        | `tips`  |
| `ui.customWittyPhrases`                | array   | You can specify custom phrases to cycle through during loading (replaces defaults when provided).                          | `[]`    |
| `ui.errorVerbosity`                    | enum    | You can choose the level of error details you want to see by selecting `low` or `full`.                                    | `low`   |
| `ui.showStatusInTitle`                 | boolean | Model thoughts are shown in your terminal title when this is enabled.                                                      | `false` |
| `ui.dynamicWindowTitle`                | boolean | Your terminal title is updated with status icons when this is enabled.                                                     | `true`  |
| `ui.hideWindowTitle`                   | boolean | The window title bar is hidden when this is enabled. ⟳                                                                     | `false` |
| `ui.useAlternateBuffer`                | boolean | Alternate screen buffer is used when this is enabled. ⟳                                                                    | `false` |
| `ui.incrementalRendering`              | boolean | Flickering is reduced when this is enabled (requires `useAlternateBuffer`). ⟳                                              | `true`  |
| `ui.showCitations`                     | boolean | Citations for generated text are shown when this is enabled.                                                               | `false` |
| `ui.showModelInfoInChat`               | boolean | The model name for each response is shown when this is enabled.                                                            | `false` |
| `ui.showUserIdentity`                  | boolean | Your signed-in user identity is shown when this is enabled.                                                                | `true`  |
| `ui.showShortcutsHint`                 | boolean | The "? for shortcuts" hint is shown when this is enabled.                                                                  | `true`  |
| `ui.hideContextSummary`                | boolean | The context summary above the input is hidden when this is enabled.                                                        | `false` |
| `ui.escapePastedAtSymbols`             | boolean | `@` symbols in pasted text are escaped when this is enabled.                                                               | `false` |
| `ui.useBackgroundColor`                | boolean | Background colors are used in the UI when this is enabled.                                                                 | `true`  |
| `ui.showHomeDirectoryWarning`          | boolean | You are warned when running in your home directory when this is enabled. ⟳                                                 | `true`  |
| `ui.showCompatibilityWarnings`         | boolean | Terminal compatibility warnings are shown when this is enabled. ⟳                                                          | `true`  |
| `ui.accessibility.screenReader`        | boolean | Screen reader mode with plain text output is activated when this is enabled. ⟳                                             | `false` |

#### Footer customization

| Setting                           | Type    | Description                                                                      | Default |
| --------------------------------- | ------- | -------------------------------------------------------------------------------- | ------- |
| `ui.footer.items`                 | array   | You can specify a list of item IDs to display in the footer (rendered in order). | —       |
| `ui.footer.showLabels`            | boolean | Descriptive headers are displayed above footer items when this is enabled.       | `true`  |
| `ui.footer.hideCWD`               | boolean | The working directory is hidden when this is enabled.                            | `false` |
| `ui.footer.hideModelInfo`         | boolean | The model name and context usage are hidden when this is enabled.                | `false` |
| `ui.footer.hideSandboxStatus`     | boolean | The sandbox indicator is hidden when this is enabled.                            | `false` |
| `ui.footer.hideContextPercentage` | boolean | The context window usage percentage is hidden when this is enabled.              | `true`  |

### Model Settings

| Setting                      | Type    | Description                                                                                                                              | Default |
| ---------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ------- |
| `model.name`                 | string  | You can specify the model identifier you want to use. See [Model Selection](/main/getting-started/tabnine-cli/features/model-selection). | —       |
| `model.maxSessionTurns`      | number  | You can set the maximum number of turns per session (`-1` means unlimited).                                                              | `-1`    |
| `model.compressionThreshold` | number  | You can specify the context usage fraction that triggers compression. ⟳                                                                  | `0.7`   |
| `model.disableLoopDetection` | boolean | Infinite loop detection is disabled when this is enabled. ⟳                                                                              | `false` |
| `model.skipNextSpeakerCheck` | boolean | The next speaker check is skipped when this is enabled.                                                                                  | `true`  |
| `model.summarizeToolOutput`  | object  | You can configure per-tool summarization settings (e.g., `{\"run_shell_command\": {\"tokenBudget\": 2000}}`).                            | —       |

### Tools Settings

| Setting                             | Type    | Description                                                                                                                                                                     | Default |
| ----------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
| `tools.enableRemoteCodeSearch`      | boolean | Tabnine Remote Code Search is enabled when this is enabled. ⟳                                                                                                                   | `true`  |
| `tools.enableCoaching`              | boolean | Tabnine Coaching Guidelines are enabled when this is enabled. See [Coaching Guidelines](/main/administering-tabnine/managing-your-team/context-engine/coaching-guidelines-v). ⟳ | `true`  |
| `tools.useRipgrep`                  | boolean | Ripgrep is used for faster file search when this is enabled.                                                                                                                    | `true`  |
| `tools.truncateToolOutputThreshold` | number  | You can specify the maximum number of characters before tool output is truncated. ⟳                                                                                             | `40000` |
| `tools.disableLLMCorrection`        | boolean | LLM error correction for edits is disabled when this is enabled. ⟳                                                                                                              | `true`  |
| `tools.searchOutputLimitEnabled`    | boolean | Search tool output size is limited when this is enabled.                                                                                                                        | `true`  |
| `tools.searchMaxChars`              | number  | You can specify the maximum number of characters from search tools.                                                                                                             | `50000` |
| `tools.core`                        | array   | You can restrict built-in tools to this allowlist. ⟳                                                                                                                            | —       |
| `tools.allowed`                     | array   | You can specify tool names that bypass the confirmation dialog. ⟳                                                                                                               | —       |
| `tools.exclude`                     | array   | You can specify tool names to exclude from discovery. ⟳                                                                                                                         | —       |
| `tools.discoveryCommand`            | string  | You can specify a command to run for tool discovery. ⟳                                                                                                                          | —       |
| `tools.callCommand`                 | string  | You can specify a custom shell command for invoking discovered tools (reads JSON from stdin, emits JSON on stdout). ⟳                                                           | —       |

#### Shell Settings

| Setting                                   | Type    | Description                                                                   | Default |
| ----------------------------------------- | ------- | ----------------------------------------------------------------------------- | ------- |
| `tools.shell.enableInteractiveShell`      | boolean | Interactive shell is used when this is enabled. ⟳                             | `true`  |
| `tools.shell.showColor`                   | boolean | Color is shown in shell output when this is enabled.                          | `false` |
| `tools.shell.inactivityTimeout`           | number  | You can specify the maximum number of seconds without output (default 5 min). | `300`   |
| `tools.shell.pager`                       | string  | You can specify the pager command for shell output.                           | `cat`   |
| `tools.shell.enableShellOutputEfficiency` | boolean | Shell output efficiency optimizations are enabled when this is enabled.       | `true`  |

#### Sandbox Settings

| Setting         | Type   | Description                                                                                                                                                                                                              | Default |
| --------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------- |
| `tools.sandbox` | object | You can enable sandboxed execution by setting this to `true`/`false`, a string command name (`"docker"`, `"podman"`), or an object with `enabled`, `command`, `image`, `allowedPaths`, and `networkAccess` properties. ⟳ | —       |

### Security Settings

| Setting                                | Type    | Description                                                                                  | Default |
| -------------------------------------- | ------- | -------------------------------------------------------------------------------------------- | ------- |
| `security.disableYoloMode`             | boolean | YOLO mode is blocked even from CLI flags when this is enabled. ⟳                             | `false` |
| `security.disableAlwaysAllow`          | boolean | "Always allow" is removed from confirmation dialogs when this is enabled. ⟳                  | `false` |
| `security.enablePermanentToolApproval` | boolean | "Allow for all future sessions" option is shown when this is enabled.                        | `false` |
| `security.autoAddToPolicyByDefault`    | boolean | "Allow for all future sessions" defaults to enabled for low-risk tools when this is enabled. | `false` |
| `security.toolSandboxing`              | boolean | Experimental per-tool sandboxing is enabled when this is enabled.                            | `false` |
| `security.blockGitExtensions`          | boolean | Extensions installed from Git are blocked when this is enabled. ⟳                            | `true`  |
| `security.allowedExtensions`           | array   | You can specify a regex allowlist for extensions (overrides `blockGitExtensions`). ⟳         | `[]`    |
| `security.folderTrust.enabled`         | boolean | Workspace trust checks are enabled when this is enabled. ⟳                                   | `true`  |
| `security.enableConseca`               | boolean | Context-aware security checker is enabled when this is enabled. ⟳                            | `false` |

#### Environment variable redaction

| Setting                                         | Type    | Description                                                                         | Default |
| ----------------------------------------------- | ------- | ----------------------------------------------------------------------------------- | ------- |
| `security.environmentVariableRedaction.enabled` | boolean | Environment variables that may contain secrets are redacted when this is enabled. ⟳ | `false` |
| `security.environmentVariableRedaction.allowed` | array   | You can specify environment variables to never redact. ⟳                            | `[]`    |
| `security.environmentVariableRedaction.blocked` | array   | You can specify environment variables to always redact. ⟳                           | `[]`    |

### Context Settings

| Setting                                           | Type    | Description                                                                                          | Default |
| ------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------- | ------- |
| `context.includeDirectoryTree`                    | boolean | Directory tree is included in initial context when this is enabled.                                  | `true`  |
| `context.discoveryMaxDirs`                        | number  | You can specify the maximum number of directories to scan for memory files.                          | `200`   |
| `context.loadMemoryFromIncludeDirectories`        | boolean | Include directories are scanned for TABNINE.md files when this is enabled.                           | `false` |
| `context.includeDirectories`                      | array   | You can specify additional directories to include in the workspace context.                          | `[]`    |
| `context.fileName`                                | string  | You can override the context file name(s) to load into memory.                                       | —       |
| `context.importFormat`                            | enum    | You can specify the memory import format (`tree` or `flat`).                                         | —       |
| `context.fileFiltering.respectGitIgnore`          | boolean | .gitignore is respected when searching when this is enabled. ⟳                                       | `true`  |
| `context.fileFiltering.respectGeminiIgnore`       | boolean | .tabnineignore is respected when searching when this is enabled. ⟳                                   | `true`  |
| `context.fileFiltering.enableRecursiveFileSearch` | boolean | Recursive file search for @ references is enabled when this is enabled. ⟳                            | `true`  |
| `context.fileFiltering.enableFuzzySearch`         | boolean | Fuzzy file search is enabled when this is enabled. ⟳                                                 | `true`  |
| `context.fileFiltering.customIgnoreFilePaths`     | array   | You can specify additional ignore file paths (take precedence over .gitignore and .tabnineignore). ⟳ | `[]`    |

### Telemetry Settings

| Setting                  | Type    | Description                                                  | Default |
| ------------------------ | ------- | ------------------------------------------------------------ | ------- |
| `telemetry.enabled`      | boolean | You can enable or disable telemetry collection.              | —       |
| `telemetry.otlpEndpoint` | string  | You can specify a custom OTLP endpoint for telemetry data.   | —       |
| `telemetry.otlpProtocol` | enum    | You can specify the OTLP protocol to use (`grpc` or `http`). | —       |
| `telemetry.logPrompts`   | boolean | Prompts are included in telemetry when this is enabled.      | —       |
| `telemetry.outfile`      | string  | You can specify a file path for writing telemetry output.    | —       |

### Billing Settings

| Setting                   | Type | Description                                                                             | Default |
| ------------------------- | ---- | --------------------------------------------------------------------------------------- | ------- |
| `billing.overageStrategy` | enum | You can specify how to handle quota exhaustion by choosing `ask`, `always`, or `never`. | `ask`   |

### MCP Servers Settings

The `mcpServers` key is a top-level object mapping server names to their configuration. See [MCP Server Config](/main/getting-started/tabnine-agent/mcp-intro-and-setup/mcp-server-config) for transport types, tool filtering, and authentication.

| Setting             | Type   | Description                                         | Default |
| ------------------- | ------ | --------------------------------------------------- | ------- |
| `mcp.serverCommand` | string | You can specify a command to start an MCP server. ⟳ | —       |
| `mcp.allowed`       | array  | You can specify an allowlist of MCP server names. ⟳ | —       |
| `mcp.excluded`      | array  | You can specify a blocklist of MCP server names. ⟳  | —       |

### Hooks Settings

See [Hooks](/main/getting-started/tabnine-cli/features/hooks) for full documentation.

| Setting                     | Type    | Description                                               | Default |
| --------------------------- | ------- | --------------------------------------------------------- | ------- |
| `hooksConfig.enabled`       | boolean | The hooks system is enabled when this is enabled. ⟳       | `true`  |
| `hooksConfig.notifications` | boolean | Indicators are shown when hooks run when this is enabled. | `true`  |
| `hooksConfig.disabled`      | array   | You can specify a list of hook command names to disable.  | `[]`    |

Hook events are configured under the `hooks` key with arrays per event: `BeforeTool`, `AfterTool`, `BeforeAgent`, `AfterAgent`, `Notification`, `SessionStart`, `SessionEnd`, `PreCompress`, `BeforeModel`, `AfterModel`, `BeforeToolSelection`.

### IDE Settings

| Setting       | Type    | Description                                             | Default |
| ------------- | ------- | ------------------------------------------------------- | ------- |
| `ide.enabled` | boolean | IDE integration mode is enabled when this is enabled. ⟳ | `false` |

### Skills Settings

| Setting           | Type    | Description                                       | Default |
| ----------------- | ------- | ------------------------------------------------- | ------- |
| `skills.enabled`  | boolean | Agent Skills are enabled when this is enabled. ⟳  | `true`  |
| `skills.disabled` | array   | You can specify a list of disabled skill names. ⟳ | `[]`    |

### Extensions Settings

| Setting               | Type  | Description                                           | Default |
| --------------------- | ----- | ----------------------------------------------------- | ------- |
| `extensions.disabled` | array | You can specify a list of disabled extension names. ⟳ | `[]`    |

### Agents Settings

| Setting                           | Type    | Description                                                                                     | Default                                       |
| --------------------------------- | ------- | ----------------------------------------------------------------------------------------------- | --------------------------------------------- |
| `agents.overrides`                | object  | You can specify per-agent override settings (model config, run config, enable/disable). ⟳       | `{}`                                          |
| `agents.browser.sessionMode`      | enum    | You can specify the browser session mode by choosing `persistent`, `isolated`, or `existing`. ⟳ | `persistent`                                  |
| `agents.browser.headless`         | boolean | The browser runs in headless mode when this is enabled. ⟳                                       | `false`                                       |
| `agents.browser.profilePath`      | string  | You can specify the path to browser profile directory for session persistence. ⟳                | —                                             |
| `agents.browser.visualModel`      | string  | You can specify a model override for the browser visual agent. ⟳                                | —                                             |
| `agents.browser.allowedDomains`   | array   | You can specify allowed domains for the browser agent. ⟳                                        | `["github.com", "*.google.com", "localhost"]` |
| `agents.browser.disableUserInput` | boolean | User input on browser window is disabled during automation when this is enabled.                | `true`                                        |

### Advanced Settings

| Setting                        | Type    | Description                                                                | Default                   |
| ------------------------------ | ------- | -------------------------------------------------------------------------- | ------------------------- |
| `advanced.autoConfigureMemory` | boolean | Node.js memory limits are automatically configured when this is enabled. ⟳ | `false`                   |
| `advanced.dnsResolutionOrder`  | string  | You can specify the DNS resolution order (`ipv4first` or `verbatim`). ⟳    | —                         |
| `advanced.excludedEnvVars`     | array   | You can specify environment variables to exclude from project context.     | `["DEBUG", "DEBUG_MODE"]` |
| `policyPaths`                  | array   | You can specify additional policy files or directories to load. ⟳          | `[]`                      |
| `adminPolicyPaths`             | array   | You can specify additional admin policy files or directories to load. ⟳    | `[]`                      |


# Built-In Tools

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

Tabnine CLI provides built-in tools that the AI uses automatically to fulfill your requests. You don't call tools directly — the AI selects the right tool based on what you ask.

```
> What files are in the src directory?
```

The AI automatically uses the `list_directory` tool.

## Available Tools

### File Operations

* **`read_file`** — Read file contents. Supports text, images (PNG, JPG, GIF, WEBP, SVG, BMP), audio (MP3, WAV, AIFF, AAC, OGG, FLAC), and PDF files. For text files, can read specific line ranges.
* **`read_many_files`** — Read content from multiple files specified by glob patterns. Handles the same file types as `read_file`. Useful for bulk reads across a directory.
* **`write_file`** — Create new files or overwrite existing ones. Creates parent directories if needed.
* **`replace`** — Make precise text replacements in existing files. Requires significant surrounding context to ensure correct edits. Can replace a single occurrence (default) or all occurrences of a match.
* **`list_directory`** — List files and subdirectories in a directory. Can filter using glob patterns and respects `.gitignore` and `.tabnineignore`.
* **`glob`** — Find files matching glob patterns (e.g., `**/*.ts`, `src/*.js`). Returns absolute paths sorted by modification time (newest first).

### Search

* **`grep_search`** — Search for regular expression patterns within file contents. Powered by [ripgrep](https://github.com/BurntSushi/ripgrep) when available. Supports context lines, case sensitivity, literal string mode, file filtering, and match limits.

  > **Note:** Older documentation may refer to this tool as `search_file_content`. That name is a legacy alias — the actual tool name is `grep_search`.

### Shell

* **`run_shell_command`** — Execute shell commands in your terminal. Supports background execution, working directory selection, and a brief description for the user.

### Web Tools (Disabled by Default)

* **`web_fetch`** — Fetch and process content from URLs (including localhost). Can handle up to 20 URLs in a single call. See [Web Fetch](/main/getting-started/tabnine-cli/features/web-fetch) for details.

These tools are **disabled by default** in Tabnine CLI. To enable them, add to your [`settings.json`](/main/getting-started/tabnine-cli/features/settings/settings-reference):

```json
{
  "tools": {
    "enableWebFetchTool": true
  }
}
```

* `enableWebFetchTool` — enables `web_fetch` (URL content fetching).

Each setting controls its respective tool independently.

### Memory & Task Management

* **`save_memory`** — Save concise global user preferences and facts that persist across all sessions and workspaces. Not for workspace-specific context.
* **`write_todos`** — Manage subtask lists for complex requests. Tracks progress with statuses: `pending`, `in_progress`, `completed`, `cancelled`, `blocked`.

### Planning

* **`enter_plan_mode`** — Switch to Plan Mode for safe research and planning of complex changes. In Plan Mode, only read-only tools are available.
* **`exit_plan_mode`** — Finalize the plan and transition to implementation. Presents the plan for user approval before any edits begin.

Plan Mode is controlled by the [`experimental.plan`](/main/getting-started/tabnine-cli/features/settings/settings-reference) setting (enabled by default).

### User Interaction

* **`ask_user`** — Ask the user one or more questions to gather preferences, clarify requirements, or make decisions. Supports multiple-choice, free-text, and yes/no question types.

### Skills

* **`activate_skill`** — Load a specialized [agent skill](/main/getting-started/tabnine-cli/features/agent-skills) by name. Skills provide expert guidance for specific tasks (e.g., coding guidelines, skill creation). Available skills vary by installation.

### Internal Documentation

* **`get_internal_docs`** — Access Tabnine CLI's built-in documentation files. Without arguments, lists all available docs. With a path argument, returns the content of that doc file.

### Task Tracker (Experimental)

These tools are gated behind [`experimental.taskTracker`](/main/getting-started/tabnine-cli/features/settings/settings-reference) (disabled by default).

* **`tracker_create_task`** — Create a new task (epic, task, or bug).
* **`tracker_update_task`** — Update an existing task's title, description, status, or dependencies.
* **`tracker_get_task`** — Retrieve details for a specific task.
* **`tracker_list_tasks`** — List tasks, optionally filtered by status, type, or parent.
* **`tracker_add_dependency`** — Add a dependency between two tasks.
* **`tracker_visualize`** — Render an ASCII tree visualization of the task graph.

### Built-In MCP Tools

The following tools are powered by Tabnine's infrastructure and run as built-in MCP servers:

* **Remote Code Search** — Search across your organization's codebases using Tabnine's cloud indexing. Controlled by `tools.enableRemoteCodeSearch` (enabled by default).
* [**Coaching Guidelines**](/main/administering-tabnine/managing-your-team/context-engine/coaching-guidelines-v) — AI-powered coding best practices tailored to your team. Controlled by `tools.enableCoaching` (enabled by default).

## Tool Summary

| Tool Name                | Display Name      | Category    |
| ------------------------ | ----------------- | ----------- |
| `read_file`              | ReadFile          | File        |
| `read_many_files`        | ReadManyFiles     | File        |
| `write_file`             | WriteFile         | File        |
| `replace`                | Edit              | File        |
| `list_directory`         | ReadFolder        | File        |
| `glob`                   | FindFiles         | File        |
| `grep_search`            | SearchText        | Search      |
| `run_shell_command`      | Shell             | Execution   |
| `google_web_search`      | GoogleSearch      | Web         |
| `web_fetch`              | WebFetch          | Web         |
| `save_memory`            | SaveMemory        | Memory      |
| `write_todos`            | WriteTodos        | Planning    |
| `enter_plan_mode`        | Enter Plan Mode   | Planning    |
| `exit_plan_mode`         | Exit Plan Mode    | Planning    |
| `ask_user`               | Ask User          | Interaction |
| `activate_skill`         | Activate Skill    | Skills      |
| `get_internal_docs`      | GetInternalDocs   | Docs        |
| `tracker_create_task`    | Create Task       | Tracker     |
| `tracker_update_task`    | Update Task       | Tracker     |
| `tracker_get_task`       | Get Task          | Tracker     |
| `tracker_list_tasks`     | List Tasks        | Tracker     |
| `tracker_add_dependency` | Add Dependency    | Tracker     |
| `tracker_visualize`      | Visualize Tracker | Tracker     |

## Viewing Tools in the CLI

To see which tools are currently available:

```
/tools
```

To include descriptions:

```
/tools desc
```

This shows all registered tools from the tool registry, including any [MCP tools](/main/getting-started/tabnine-agent/mcp-intro-and-setup/mcp-server-config) and [subagents](/main/getting-started/tabnine-cli/features/subagents) you have configured.

## Tool Configuration

### Auto-Approval

By default, tools that modify files or execute commands require user confirmation. Read-only tools (read, search, list, glob) execute automatically.

To auto-approve specific tools, use the `tools.allowed` setting:

```json
{
  "tools": {
    "allowed": [
      "run_shell_command(git)",
      "run_shell_command(npm test)",
      "write_file"
    ]
  }
}
```

For shell commands, you can narrow approval to specific command prefixes by using the `run_shell_command(prefix)` syntax.

{% hint style="info" %}
You can also change the approval mode during a session using `Ctrl+Y` to cycle between Default, Auto-Edit, and Plan modes. See [Keyboard Shortcuts](/main/getting-started/tabnine-cli/features/keyboard-shortcuts) for the full list.
{% endhint %}

### Restricting Tools

To restrict which built-in tools are available:

```json
{
  "tools": {
    "core": ["read_file", "grep_search", "list_directory", "glob"],
    "exclude": ["run_shell_command"]
  }
}
```

* `tools.core` — Allowlist of built-in tool names. Only these tools are loaded.
* `tools.exclude` — Denylist of tool names to remove.

### Tool Settings Reference

| Setting                                   | Type       | Default | Description                                                                                                                                                         |
| ----------------------------------------- | ---------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `tools.shell.enableInteractiveShell`      | `boolean`  | `true`  | Use node-pty for an interactive shell. Falls back to `child_process` if unavailable.                                                                                |
| `tools.shell.showColor`                   | `boolean`  | `false` | Show color in shell output.                                                                                                                                         |
| `tools.shell.pager`                       | `string`   | `"cat"` | Pager command for shell output.                                                                                                                                     |
| `tools.shell.inactivityTimeout`           | `number`   | `300`   | Max seconds without output before shell times out (5 minutes).                                                                                                      |
| `tools.shell.enableShellOutputEfficiency` | `boolean`  | `true`  | Enable shell output efficiency optimizations.                                                                                                                       |
| `tools.useRipgrep`                        | `boolean`  | `true`  | Use ripgrep for `grep_search`. Falls back to built-in grep if disabled or unavailable.                                                                              |
| `tools.enableWebTools`                    | `boolean`  | `false` | Enable the `google_web_search` tool.                                                                                                                                |
| `tools.enableWebFetchTool`                | `boolean`  | `false` | Enable the `web_fetch` tool.                                                                                                                                        |
| `tools.enableRemoteCodeSearch`            | `boolean`  | `true`  | Enable Tabnine Remote Code Search MCP server.                                                                                                                       |
| `tools.enableCoaching`                    | `boolean`  | `true`  | Enable Tabnine Coaching Guidelines MCP server.                                                                                                                      |
| `tools.truncateToolOutputThreshold`       | `number`   | `40000` | Truncate tool output exceeding this many characters. First 20% and last 80% are kept.                                                                               |
| `tools.searchOutputLimitEnabled`          | `boolean`  | `true`  | Limit search tool result size.                                                                                                                                      |
| `tools.searchMaxChars`                    | `number`   | `50000` | Max characters from search tools.                                                                                                                                   |
| `tools.disableLLMCorrection`              | `boolean`  | `true`  | Disable LLM-based error correction for the `replace` tool. When true, edits fail immediately if the exact string isn't found instead of attempting self-correction. |
| `tools.allowed`                           | `string[]` | —       | Tool names that bypass the confirmation dialog.                                                                                                                     |
| `tools.core`                              | `string[]` | —       | Restrict built-in tools to this allowlist.                                                                                                                          |
| `tools.exclude`                           | `string[]` | —       | Tool names to exclude entirely.                                                                                                                                     |
| `experimental.plan`                       | `boolean`  | `true`  | Enable Plan Mode (`enter_plan_mode` / `exit_plan_mode`).                                                                                                            |
| `experimental.taskTracker`                | `boolean`  | `false` | Enable experimental task tracker tools.                                                                                                                             |

{% hint style="info" %}
Tools that modify files or run shell commands always ask for confirmation before performing the action, unless auto-approved via `tools.allowed` or the approval mode is set to YOLO or Auto-Edit.
{% endhint %}


# Keyboard Shortcuts

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

Reference for all keyboard shortcuts in Tabnine CLI.

Key bindings can be customized via `~/.tabnine/agent/keybindings.json`. See [Custom Key Bindings](#custom-key-bindings) at the bottom of this page. For [slash commands](/main/getting-started/tabnine-cli/features/commands), type `/` on an empty prompt.

### Basic Controls

| Action                       | Keys                                              |
| ---------------------------- | ------------------------------------------------- |
| Confirm selection            | `Enter`                                           |
| Dismiss dialog               | `Esc`, `Ctrl+[`                                   |
| Cancel request / clear input | `Ctrl+C`                                          |
| Exit (empty input buffer)    | `Ctrl+D`                                          |
| Suspend to background        | `Ctrl+Z` (double-press; not supported on Windows) |

### Text Input

| Action                  | Keys                                                            |
| ----------------------- | --------------------------------------------------------------- |
| Submit prompt           | `Enter`                                                         |
| New line without submit | `Ctrl+Enter`, `Cmd+Enter`, `Alt+Enter`, `Shift+Enter`, `Ctrl+J` |
| Open external editor    | `Ctrl+X`                                                        |
| Paste from clipboard    | `Ctrl+V`, `Cmd+V`, `Alt+V`                                      |

### Cursor Movement

| Action        | Keys                               |
| ------------- | ---------------------------------- |
| Start of line | `Ctrl+A`, `Home`                   |
| End of line   | `Ctrl+E`, `End`                    |
| Move up       | `Up`                               |
| Move down     | `Down`                             |
| Move left     | `Left`                             |
| Move right    | `Right`, `Ctrl+F`                  |
| Word left     | `Ctrl+Left`, `Alt+Left`, `Alt+B`   |
| Word right    | `Ctrl+Right`, `Alt+Right`, `Alt+F` |

### Editing

| Action                  | Keys                                         |
| ----------------------- | -------------------------------------------- |
| Delete to end of line   | `Ctrl+K`                                     |
| Delete to start of line | `Ctrl+U`                                     |
| Delete previous word    | `Ctrl+Backspace`, `Alt+Backspace`, `Ctrl+W`  |
| Delete next word        | `Ctrl+Delete`, `Alt+Delete`, `Alt+D`         |
| Delete character left   | `Backspace`, `Ctrl+H`                        |
| Delete character right  | `Delete`, `Ctrl+D`                           |
| Undo                    | `Cmd+Z`, `Alt+Z`                             |
| Redo                    | `Ctrl+Shift+Z`, `Cmd+Shift+Z`, `Alt+Shift+Z` |

### Scrolling

| Action           | Keys                      |
| ---------------- | ------------------------- |
| Scroll up        | `Shift+Up`                |
| Scroll down      | `Shift+Down`              |
| Scroll to top    | `Ctrl+Home`, `Shift+Home` |
| Scroll to bottom | `Ctrl+End`, `Shift+End`   |
| Page up          | `Page Up`                 |
| Page down        | `Page Down`               |

### History & Search

| Action                   | Keys     |
| ------------------------ | -------- |
| Previous history         | `Ctrl+P` |
| Next history             | `Ctrl+N` |
| Reverse search           | `Ctrl+R` |
| Submit search result     | `Enter`  |
| Accept search suggestion | `Tab`    |

{% hint style="info" %}
`Up`/`Down` arrows also navigate input history when the cursor is on the first or last line.
{% endhint %}

### Navigation

| Action               | Keys        |
| -------------------- | ----------- |
| Move up in lists     | `Up`        |
| Move down in lists   | `Down`      |
| Move up in dialogs   | `Up`, `K`   |
| Move down in dialogs | `Down`, `J` |
| Next dialog item     | `Tab`       |
| Previous dialog item | `Shift+Tab` |

### Auto-Completion

| Action              | Keys             |
| ------------------- | ---------------- |
| Accept suggestion   | `Tab`, `Enter`   |
| Previous option     | `Up`, `Ctrl+P`   |
| Next option         | `Down`, `Ctrl+N` |
| Expand suggestion   | `Right`          |
| Collapse suggestion | `Left`           |

### App Controls

| Action                                                                                   | Keys        |
| ---------------------------------------------------------------------------------------- | ----------- |
| Clear screen                                                                             | `Ctrl+L`    |
| Toggle Markdown rendering                                                                | `Alt+M`     |
| Toggle error details                                                                     | `F12`       |
| Toggle copy mode                                                                         | `Ctrl+S`    |
| Toggle TODO list                                                                         | `Ctrl+T`    |
| Toggle IDE context                                                                       | `Ctrl+G`    |
| Toggle YOLO mode                                                                         | `Ctrl+Y`    |
| Cycle [approval mode](/main/getting-started/tabnine-cli/features/settings#approval-mode) | `Shift+Tab` |
| Expand/collapse blocks                                                                   | `Ctrl+O`    |
| Focus shell input                                                                        | `Tab`       |
| Unfocus shell input                                                                      | `Shift+Tab` |
| Toggle background shell                                                                  | `Ctrl+B`    |

### Shell Mode

| Action            | Keys                 |
| ----------------- | -------------------- |
| Toggle shell mode | `!` (on empty input) |
| Exit shell mode   | `Esc`                |

### Special Keys

| Action                | Keys                             |
| --------------------- | -------------------------------- |
| Show shortcuts panel  | `?` (on empty input)             |
| Select file or folder | `@`                              |
| Clear and rewind      | `Esc` `Esc` (double-press)       |
| Line continuation     | `` ` `` at end of line + `Enter` |

### Vim Mode

When Vim mode is enabled (via `/vim` command or `general.vimMode` [setting](/main/getting-started/tabnine-cli/features/settings/settings-reference)):

#### NORMAL Mode

* Navigate: `h`, `j`, `k`, `l`, `Left`, `Right`, `Up`, `Down`
* Word jumps: `w`, `W`, `b`, `B`, `e`, `E`
* Find character: `f{char}`, `F{char}`, `t{char}`, `T{char}`, `;`, `,`
* Line start/end: `0`, `$`, `^`
* Go to line: `gg`, `G`, `{count}G`
* Edit: `x`, `X`, `~`, `r{char}`
* Delete: `dd`, `D`, `d{motion}` (dw, db, de, dh, dj, dk, dl, d0, d$, d^, dgg, dG)
* Change: `cc`, `C`, `c{motion}` (cw, cb, ce, ch, cj, ck, cl, c0, c$, c^, cgg, cG)
* Insert: `i`, `a`, `o`, `O`, `I`, `A`
* Yank: `yy`, `yw`, `yW`, `ye`, `yE`, `y$`, `Y`
* Paste: `p`, `P`
* Undo: `u`
* Repeat: `.`
* Count prefix: `{count}` before any command

#### INSERT Mode

* Return to NORMAL: `Esc`, `Ctrl+[`
* All standard editing keys pass through

## Custom Key Bindings

Create `~/.tabnine/agent/keybindings.json` to add or remove bindings:

```json
[
  { "command": "app.toggleMarkdown", "key": "ctrl+m" },
  { "command": "-app.toggleMarkdown", "key": "alt+m" }
]
```

* Prefix a command with `-` to remove a binding
* Key format: modifiers joined with `+` (e.g., `ctrl+shift+a`, `alt+enter`)
* Available modifiers: `ctrl`, `shift`, `alt` (or `option`/`opt`), `cmd` (or `meta`)

{% hint style="info" %}
Quick tips:

* Type `?` on an empty prompt to show the shortcuts panel
* In dialogs, type numbers `1`–`9` to jump to options
* Shell commands run with `TABNINE_CLI=1` environment variable
  {% endhint %}


# Model Selection

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

Choose which AI model powers your Tabnine CLI interactions.

### Opening the Model Dialog

```bash
/model
```

This opens an interactive dialog showing available models.

### Available Models

Tabnine CLI uses the same models described on the [AI Models](/main/welcome/readme/ai-models) page.

### Changing Models

#### Via `/model` Command

{% stepper %}
{% step %}
**Open the model dialog**

Run:

```bash
/model
```

This opens the interactive model selection dialog.
{% endstep %}

{% step %}
**Navigate**

Use the arrow keys or `J` / `K` to move through available models.
{% endstep %}

{% step %}
**Select**

Press `Enter` to select the highlighted model.
{% endstep %}

{% step %}
**Immediate effect**

Model changes take effect immediately after selection.
{% endstep %}
{% endstepper %}

#### Via `/model set` (Non-Interactive)

You can also change the model without opening the dialog:

```bash
/model set <model-name>
```

This sets the model for the current session only. To persist the change across sessions, add the `--persist` flag:

```bash
/model set <model-name> --persist
```

#### Via `--model` Flag

Specify the model when launching Tabnine CLI:

```bash
tabnine --model <model-name>
```

The `-m` short form also works:

```bash
tabnine -m <model-name>
```

#### Via Environment Variable

Set the `TABNINE_MODEL` environment variable before launching:

```bash
TABNINE_MODEL=<model-name> tabnine
```

### Model Selection Precedence

When multiple sources specify a model, the following precedence applies (highest to lowest):

1. `--model` command-line flag (or `-m`)
2. `TABNINE_MODEL` environment variable
3. `model.name` in `settings.json`
4. Default model from Tabnine service

### Model Information

View current session statistics (including token usage):

```bash
/stats
```

View current model and context usage in the footer (shown if enabled in settings).

#### Token Limits

Tabnine CLI automatically manages token limits based on the selected model.

### Fallback Behavior

If your selected model is unavailable, Tabnine CLI may:

1. Prompt you to select another model
2. Automatically fall back to a default model (depending on settings)

### Model Persistence

Your model selection is saved and persists across sessions when using:

* `/model set <model-name> --persist` — writes `model.name` to `settings.json`
* The interactive `/model` dialog — persists your selection automatically

Persistent selections are stored in `.tabnine/agent/settings.json`.

### Fast Model Configuration

You can configure a lightweight model to handle background CLI tasks, reducing latency for operations the user never directly sees. To configure a fast model, add `"fastModel": "<model-name>"` to your `settings.json` or use the `/model fast` slash command in the CLI.

The following tasks are routed to the fast model when one is configured:

* Session summary
* Shell output summary
* Tool output summary
* Edit corrector
* Fast ack helper
* Loop detection (primary pass)
* LLM edit fixer

Loop detection double-check and next-speaker checker remain on the main model, as they require higher-confidence reasoning. When no fast model is configured, all tasks use the main model. The fast model setting is provider-agnostic and works with any model the backend supports.


# Commands

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

Tabnine CLI supports built-in commands to help you manage your session, customize the interface, and control its behavior. Commands are prefixed with `/`, `@`, or `!`.

### Slash Commands (`/`)

Slash commands provide meta-level control over the CLI.

| Command                   | Description                                                                                                                                 |
| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| **Core Commands**         |                                                                                                                                             |
| `/help` or `/?`           | Display help information about Tabnine CLI, including available commands and their usage.                                                   |
| `/about`                  | Show version information. Share this when filing issues.                                                                                    |
| `/auth`                   | Manage authentication (`/auth signin`, `/auth signout`).                                                                                    |
| `/quit` or `/exit`        | Exit Tabnine CLI.                                                                                                                           |
| `/clear`                  | Clear the terminal screen and conversation history. **Shortcut**: `Ctrl+L`                                                                  |
| **Session Management**    |                                                                                                                                             |
| `/chat save <tag>`        | Save current conversation with a tag.                                                                                                       |
| `/chat resume <tag>`      | Resume a saved conversation.                                                                                                                |
| `/chat list`              | List available saved conversations.                                                                                                         |
| `/chat delete <tag>`      | Delete a saved conversation.                                                                                                                |
| `/chat share <file>`      | Export conversation to a Markdown or JSON file.                                                                                             |
| `/resume`                 | Browse and resume previous conversation sessions interactively.                                                                             |
| `/restore [tool_call_id]` | Restore project files to the state before a tool was executed. Lists available checkpoints if no ID provided.                               |
| `/compress`               | Replace chat context with a summary to save tokens while retaining history.                                                                 |
| `/rewind`                 | Jump back to a specific message and restart the conversation from that point.                                                               |
| **Tools & Functionality** |                                                                                                                                             |
| `/mcp list` or `/mcp ls`  | List configured MCP servers and tools.                                                                                                      |
| `/mcp desc`               | List with descriptions.                                                                                                                     |
| `/mcp schema`             | List with descriptions and schemas.                                                                                                         |
| `/mcp auth <server>`      | Authenticate with an OAuth-enabled MCP server.                                                                                              |
| `/mcp reload`             | Restart all MCP servers.                                                                                                                    |
| `/tools`                  | Display available tools. Use `/tools desc` for descriptions.                                                                                |
| **Memory Management**     |                                                                                                                                             |
| `/memory add <text>`      | Add text to AI's memory.                                                                                                                    |
| `/memory show`            | Display full memory content.                                                                                                                |
| `/memory reload`          | Reload from `TABNINE.md` files.                                                                                                             |
| `/memory list`            | List paths of `TABNINE.md` files in use.                                                                                                    |
| **Directory Management**  |                                                                                                                                             |
| `/directory add <path>`   | Add directories to workspace.                                                                                                               |
| `/directory show`         | Display all workspace directories.                                                                                                          |
| **Configuration**         |                                                                                                                                             |
| `/model`                  | Open dialog to choose your AI model. See [Model Selection](/main/getting-started/tabnine-cli/features/model-selection).                     |
| `/settings`               | Open settings editor to view and modify Tabnine CLI settings. See [Settings](/main/getting-started/tabnine-cli/features/settings).          |
| `/theme`                  | Open dialog to change the visual theme. See [Themes](/main/getting-started/tabnine-cli/features/themes).                                    |
| `/editor`                 | Open dialog for selecting a preferred external editor.                                                                                      |
| `/vim`                    | Toggle vim mode on/off.                                                                                                                     |
| `/shortcuts`              | Toggle the keyboard shortcuts panel.                                                                                                        |
| **Utilities**             |                                                                                                                                             |
| `/copy`                   | Copy last output to clipboard. Requirements: Linux: `xclip` or `xsel`, macOS: `pbcopy`, Windows: `clip`.                                    |
| `/stats`                  | Display session statistics (token usage, cached tokens, duration).                                                                          |
| `/bug <description>`      | File an issue about Tabnine CLI.                                                                                                            |
| `/init`                   | Analyze current directory and generate a tailored `TABNINE.md` file.                                                                        |
| `/hooks`                  | Manage hooks (`panel`, `enable`, `disable`, `enable-all`, `disable-all`). See [Hooks](/main/getting-started/tabnine-cli/features/hooks).    |
| `/permissions`            | Manage folder trust settings (if enabled).                                                                                                  |
| `/shells`                 | Toggle the background shells view.                                                                                                          |
| `/docs`                   | Open full Tabnine CLI documentation in your browser.                                                                                        |
| `/extensions`             | Manage extensions (`list`, `install`, `uninstall`, `enable`, `disable`, `update`, `explore`, `link`, `reload`, `config`).                   |
| `/skills`                 | Manage agent skills (if enabled).                                                                                                           |
| `/commands reload`        | Reload custom command definitions from `.toml` files.                                                                                       |
| `/ide`                    | Manage IDE integration status and companion installation. See [IDE Integration](/main/getting-started/tabnine-cli/features/ide-integration) |

***

### At Commands (`@`)

Include file/directory content in your prompt.

#### @

Inject file or directory content.

Examples:

```
@src/index.ts Explain this code
@docs/ Summarize these documents
What is @README.md about?
```

Features:

* Git-aware filtering (excludes `node_modules/`, `.git/`, etc.)
* Recursive directory reading
* Escape spaces: `@My\ Documents/file.txt`

Note: Uses `read_many_files` tool internally

#### @ (lone)

Pass literal `@` symbol to model.

***

### Shell Mode (`!`)

Execute shell commands directly.

#### !

Execute a shell command and return to Tabnine CLI.

Examples:

```
!ls -la
!git status
!npm test
```

Shells:

* Linux/macOS: `bash`
* Windows: `powershell.exe -NoProfile -Command`

#### ! (toggle)

Toggle shell mode on/off. When active, all input is interpreted as shell commands.

Environment: Commands run with `TABNINE_CLI=1` environment variable set.

{% hint style="danger" %}
**Warning:** Commands executed via the Tabnine CLI will have the same system permissions as the user running the CLI.
{% endhint %}

***

### Custom Commands

Custom commands are reusable shortcuts for frequently-used prompts, enhancing efficiency and maintaining consistency.

#### Creating Custom Commands

Custom commands are stored in your settings and can be global or project-specific:

* **Global commands**: Located in `~/.tabnine/agent/commands/`
* **Project-specific commands**: Located in `<your-project-root>/.tabnine/agent/commands/`

If a project command has the same name as a global command, the project command takes precedence.

Command names are based on file paths relative to the `commands` directory. Subdirectories create namespaced commands; path separators convert to colons (`:`). For example:

* Global: `~/.tabnine/agent/commands/review.toml` becomes `/review`
* Project-specific: `<project>/.tabnine/agent/commands/code/review.toml` becomes `/code:review`

#### TOML File Format

* **Fields**:
  * `prompt` (String) - *Required*: The prompt executed by the model.
  * `description` (String) - *Optional*: A brief description shown in the `/help` menu.

**Example**

`~/.tabnine/agent/commands/review.toml`

```toml
prompt = "Review the following code for: - Security vulnerabilities - Performance issues - Best practices - Code quality"
description = "Review code for best practices"
```

#### Using Custom Commands

Invoke commands like `/review @src/index.ts`. Templates expand with additional input.

#### Shell Injection

Integrate shell outputs using `!{...}` within the `prompt`. This gathers local context, e.g., file content or Git status. Upon shell command execution, confirmation is required for security.

#### Context Injection

* `{{args}}`: Replaced with user-typed text. When used Inside `!{...}`, arguments are shell-escaped.

#### File Content Injection

Embed file or directory content with `@{...}` syntax.

#### Custom Command Example

Explore a sample `.toml` configuration for context and file content injection in a command script.

```toml
# File: ~/.tabnine/agent/commands/review/pr.toml
# Usage: /review:pr <PR_number>

description = "Reviews a GitHub PR with full context including diff, file contents, and CI status"

prompt = """
You are an experienced code reviewer. Please review the following pull request comprehensively.

## Pull Request: {{args}}

### Current Branch Status
!{git branch --show-current}

### Changes in this PR
!{git diff main...HEAD}

### Modified Package Configuration
@{package.json}

### CI/CD Status
!{gh pr view {{args}} --json statusCheckRollup --jq '.statusCheckRollup[].conclusion'}

Please provide:
1. A summary of changes for PR #{{args}}
2. Potential bugs or issues
3. Security concerns
4. Performance implications
5. Suggestions for improvement

Focus on code quality, maintainability, and adherence to best practices.
"""
```

#### Explanation:

* **`{{args}}` - User Arguments**: Captures the PR number to customize the command for any PR.
* **`!{...}` - Live Command Execution**: Executes shell commands in real-time:
  * Retrieves the current git branch.
  * Generates the diff between `main` and `HEAD`.
  * Fetches CI/CD test results using GitHub CLI.
  * Combines with `{{args}}` for specific PR status.
* **`@{...}` - File Content Injection**: Injects `package.json` content into the prompt, providing insight into dependencies and project configurations.

This setup automates comprehensive code reviews for GitHub PRs by assembling all relevant information - PR number, code changes, test status, and files - into a single, structured prompt.

#### Best Practices

* **Focus**: One clear purpose per command.
* **Naming**: Use descriptive, brief names.
* **Descriptions**: Aid in command recall.
* **Version Control**: Commit `.tabnine/commands/` for team use.

#### Listing Custom Commands

Use `/help` to see custom commands alongside built-in options.


# Checkpointing

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

Checkpointing automatically saves a snapshot of your project's file state before any file modifications are made by AI-powered tools. This lets you safely experiment with code changes, knowing you can instantly revert back to the state before the tool was run.

For related commands and configuration, see [Commands](/main/getting-started/tabnine-cli/features/commands), [Settings](/main/getting-started/tabnine-cli/features/settings), and [Settings Reference](/main/getting-started/tabnine-cli/features/settings/settings-reference).

## How it works

When a tool that modifies the file system (like `write_file` or `replace`) is proposed and awaiting your approval, the CLI automatically creates a checkpoint. This checkpoint includes:

{% stepper %}
{% step %}
**A Git snapshot**

A commit is made in a shadow Git repository that captures the complete state of your project files at that moment. This does **not** interfere with your project's own Git repository or history.
{% endstep %}

{% step %}
**Conversation history**

The conversation you've had with the agent up to that point is saved alongside the snapshot.
{% endstep %}

{% step %}
**The tool call**

The specific tool call that was about to be executed is stored, so it can be re-proposed after a restore.
{% endstep %}
{% endstepper %}

Checkpoint data is stored locally on your machine. The Git snapshots are kept in the shadow repository, and the conversation history and tool call metadata are saved as JSON files in your project's temporary checkpoints directory.

## Requirements

* **Git must be installed.** Checkpointing uses Git internally to create snapshots. If Git is not available, checkpointing will silently fail and no snapshots will be created.
* Your project directory must be accessible for file operations.

## Enabling checkpointing

Checkpointing is **disabled by default**. To enable it, add the following to your `settings.json` (located at `~/.tabnine/agent/settings.json`). For more about CLI configuration, see [Settings](/main/getting-started/tabnine-cli/features/settings) and [Settings Reference](/main/getting-started/tabnine-cli/features/settings/settings-reference):

```json
{
  "general": {
    "checkpointing": {
      "enabled": true
    }
  }
}
```

A restart of Tabnine CLI is required after changing this setting.

{% hint style="info" %}
This setting is not available through the [`/settings` menu](/main/getting-started/tabnine-cli/features/settings) — configure it directly in `settings.json`.
{% endhint %}

## Using the `/restore` command

Once checkpointing is enabled, snapshots are created automatically before file-modifying tool calls. The [`/restore` command](/main/getting-started/tabnine-cli/features/commands) lets you manage and revert to these snapshots.

{% hint style="info" %}
The `/restore` command is only available when checkpointing is enabled. If you don't see it in your command list, verify that checkpointing is enabled in your settings.
{% endhint %}

### List available checkpoints

To see all available checkpoints for the current session, run `/restore` with no arguments:

```bash
/restore
```

The CLI displays a list of checkpoint names. Each name includes a timestamp, the file that was being modified, and the tool that was about to run. For example:

```bash
2025-06-22T10-00-00_000Z-my-file.txt-write_file
```

### Restore a specific checkpoint

To restore your project to a specific checkpoint, pass the checkpoint name as an argument:

```bash
/restore <checkpoint-name>
```

For example:

```bash
/restore 2025-06-22T10-00-00_000Z-my-file.txt-write_file
```

Tab completion is available — start typing and press Tab to autocomplete checkpoint names.

After restoring:

* All files in your project are reverted to the state captured in the snapshot.
* The conversation history is restored to the point when the checkpoint was created.
* The original tool call is re-proposed, allowing you to run it again or skip it.

## Limitations

* Checkpoints are scoped to the current session. The checkpoints directory is cleaned up automatically when a new session starts, so previous checkpoints are no longer available after restarting the CLI.
* Only file-modifying tool calls (like `write_file` and `replace`) trigger automatic checkpoints. Shell commands that modify files do **not** trigger checkpoints.
* Checkpoints are not created when running in YOLO mode (`--yolo` or `--approval-mode=yolo`), because tools are executed immediately without an approval pause.
* Restoring a checkpoint reverts **all** file changes back to the saved state — selective file restoration is not supported.

### Related docs

* [Commands](/main/getting-started/tabnine-cli/features/commands)
* [Settings](/main/getting-started/tabnine-cli/features/settings)
* [Settings Reference](/main/getting-started/tabnine-cli/features/settings/settings-reference)
* [FAQ](/main/getting-started/tabnine-cli/troubleshooting/faq)


# Themes

Customize the visual appearance of Tabnine CLI with built-in themes.

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

Customize the visual appearance of Tabnine CLI with built-in themes.

### Available Themes

Tabnine CLI includes the following built-in themes:

* **Dark themes:**
  * `ANSI`
  * `Atom One`
  * `Ayu`
  * `Default`
  * `Dracula`
  * `GitHub`
  * `Holiday`
  * `Shades Of Purple`
  * `Solarized Dark`
* **Light themes:**
  * `ANSI Light`
  * `Ayu Light`
  * `Default Light`
  * `GitHub Light`
  * `Google Code`
  * `Solarized Light`
  * `Xcode`

**Theme Persistence:** Your theme selection is saved to `.tabnine/agent/settings.json` and persists across sessions.

### Changing Themes

You can switch between themes in two ways, either by using the `/theme` command or via `/settings`.

{% tabs %}
{% tab title="/theme" %}
{% stepper %}
{% step %}
**Command**

Type the `/theme` command. This will open an interactive theme selector.

```bash
/theme
```

{% endstep %}

{% step %}
**Navigate**

Use arrow keys or `J`/`K`.
{% endstep %}

{% step %}
**Preview**

Preview the theme in real-time.
{% endstep %}

{% step %}
**Apply**

Press `Enter` to apply.
{% endstep %}
{% endstepper %}

{% hint style="info" %}
The `/theme` dialog lets you choose which scope to save to (User, Workspace, or System) using the `Tab` key. If `ui.theme` is set at multiple scopes, the highest-precedence scope wins at runtime: Workspace overrides User, and System overrides both
{% endhint %}
{% endtab %}

{% tab title="/settings" %}
Edit the file at `.tabnine/agent/settings.json`, setting the `"theme"` value to any of the available theme names listed above.

```json
{
  "ui": {
    "theme": "Dracula"
  }
}
```

{% endtab %}
{% endtabs %}

### Custom Themes

#### Defining a custom theme in settings.json

Add a `customThemes` section to your `settings.json` file (user, project, or system level). Each custom theme is an object keyed by a unique name.

**Required properties:**

* `name` — must match the key in `customThemes` and be a non-empty string (max 50 characters)
* `type` — must be the string `"custom"`

**Optional properties:**

| Group        | Property       | Description                             |
| ------------ | -------------- | --------------------------------------- |
| `text`       | `primary`      | Default text color                      |
|              | `secondary`    | Less prominent text                     |
|              | `link`         | URLs and links                          |
|              | `accent`       | Highlights and emphasis                 |
| `background` | `primary`      | Main background color                   |
|              | `diff.added`   | Background for added lines in diffs     |
|              | `diff.removed` | Background for removed lines in diffs   |
| `border`     | `default`      | Standard border color                   |
|              | `focused`      | Border color when an element is focused |
| `ui`         | `comment`      | Color for code comments                 |
|              | `symbol`       | Color for code symbols and operators    |
|              | `gradient`     | Array of colors for gradient effects    |
| `status`     | `success`      | Color for successful operations         |
|              | `warning`      | Color for warnings                      |
|              | `error`        | Color for errors                        |

Use hex codes (e.g., `#FF0000`) or CSS color names (e.g., `coral`, `teal`).

Example:

```json
{
  "ui": {
    "customThemes": {
      "MyCustomTheme": {
        "name": "MyCustomTheme",
        "type": "custom",
        "background": {
          "primary": "#181818"
        },
        "text": {
          "primary": "#f0f0f0",
          "secondary": "#a0a0a0",
          "link": "#5599ff",
          "accent": "#cc99ff"
        },
        "status": {
          "error": "#ff4444",
          "success": "#44ff44",
          "warning": "#ffaa00"
        }
      }
    }
  }
}
```

You can define multiple custom themes by adding more entries to the `customThemes` object.

#### Loading a theme from a file

You can also load a theme directly from a JSON file by setting the `"theme"` property to an absolute file path:

```json
{
  "ui": {
    "theme": "/Users/yourname/.config/my-theme.json"
  }
}
```

{% hint style="warning" %}
The theme file must be located inside your home directory. Files outside your home directory are rejected for security reasons.
{% endhint %}

The file must be a valid JSON file following the same structure as a custom theme defined in `settings.json`. Example `my-theme.json`:

```json
{
  "name": "My File Theme",
  "type": "custom",
  "background": {
    "primary": "#282828"
  },
  "text": {
    "primary": "#ebdbb2",
    "secondary": "#a89984"
  }
}
```

### See Also

* [Commands](/main/getting-started/tabnine-cli/features/commands)
* [Settings](/main/getting-started/tabnine-cli/features/settings)


# Hooks

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

Hooks allow you to run custom scripts at specific points during Tabnine CLI's agent loop, enabling you to intercept and customize behavior without modifying the CLI itself.

## What are hooks?

Hooks run synchronously as part of the agent loop — when a hook event fires, Tabnine CLI waits for all matching hooks to complete before continuing.

With hooks, you can:

* **Add context**: Inject relevant information (like git history or project state) before the model processes a request.
* **Validate actions**: Review tool arguments and block potentially dangerous operations.
* **Enforce policies**: Implement security scanners and compliance checks.
* **Modify inputs**: Rewrite tool arguments before execution (e.g., enforcing file path restrictions).
* **Log interactions**: Track tool usage and model responses for auditing.

## Quick start

Add two files to any git-initialized project:

**`.tabnine/agent/settings.json`**

```json
{
  "hooks": {
    "SessionStart": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "node ./hooks/announce.js",
            "name": "announce"
          }
        ]
      }
    ]
  }
}
```

**`hooks/announce.js`**

```javascript
let data = '';
process.stdin.on('data', (chunk) => { data += chunk; });
process.stdin.on('end', () => {
  const input = JSON.parse(data);
  process.stdout.write(JSON.stringify({
    systemMessage: '🪝 Hooks are working! Session started.'
  }));
});
```

Start Tabnine CLI in that project — you'll see `🪝 Hooks are working! Session started.` printed in the terminal.

## Communication protocol

Hooks communicate with Tabnine CLI via JSON on standard I/O:

* **Input**: JSON is written to the hook's **stdin**.
* **Output**: The hook writes JSON to **stdout**.
* **Logging**: Use **stderr** for all debug output. Tabnine CLI never parses stderr as JSON.

{% hint style="warning" %}
**Important**: Your hook must not print anything to stdout other than the final JSON object. Even a single stray `echo` before the JSON will break parsing. If stdout contains invalid JSON, the CLI defaults to "allow" and treats the entire output as a `systemMessage`.
{% endhint %}

### Exit codes

| Exit Code | Label            | Behavior                                                                                                            |
| --------- | ---------------- | ------------------------------------------------------------------------------------------------------------------- |
| **0**     | **Success**      | stdout is parsed as JSON. Preferred for all logic, including intentional blocks (use `"decision": "deny"` in JSON). |
| **2**     | **System Block** | The action is blocked. stderr is used as the rejection reason.                                                      |
| **Other** | **Warning**      | Non-fatal failure. A warning is shown, but execution proceeds normally.                                             |

### Base input schema

All hooks receive these common fields via stdin:

```json
{
  "session_id": "uuid-string",
  "transcript_path": "/absolute/path/to/session.json",
  "cwd": "/project/root",
  "hook_event_name": "BeforeTool",
  "timestamp": "2025-01-01T00:00:00.000Z"
}
```

### Common output fields

| Field            | Type      | Description                                                           |
| ---------------- | --------- | --------------------------------------------------------------------- |
| `decision`       | `string`  | `"allow"` or `"deny"` (alias `"block"`). Impact depends on the event. |
| `reason`         | `string`  | Feedback message when `decision` is `"deny"`.                         |
| `systemMessage`  | `string`  | Displayed immediately to the user in the terminal.                    |
| `continue`       | `boolean` | If `false`, stops the entire agent loop immediately.                  |
| `stopReason`     | `string`  | Displayed to the user when `continue` is `false`.                     |
| `suppressOutput` | `boolean` | If `true`, hides internal hook metadata from logs/telemetry.          |

## Environment variables

Hooks are executed with a sanitized environment. The following variables are always available:

| Variable              | Description                                     |
| --------------------- | ----------------------------------------------- |
| `TABNINE_PROJECT_DIR` | Absolute path to the project root.              |
| `CLAUDE_PROJECT_DIR`  | Alias of `TABNINE_PROJECT_DIR` (compatibility). |

Additionally, these variables are expanded in the `command` string before execution:

* `$TABNINE_PROJECT_DIR`
* `$GEMINI_PROJECT_DIR` (expanded to the same value)
* `$CLAUDE_PROJECT_DIR` (expanded to the same value)

Custom environment variables can be added per-hook using the `env` field in hook configuration.

## Hook events

Tabnine CLI supports 11 hook events:

| Event                 | When it fires                                  | Can block? | Common use cases                        |
| --------------------- | ---------------------------------------------- | ---------- | --------------------------------------- |
| `SessionStart`        | When a session begins (startup, resume, clear) | No         | Initialize resources, inject context    |
| `SessionEnd`          | When a session ends (exit, clear)              | No         | Clean up, save state                    |
| `BeforeAgent`         | After user submits prompt, before planning     | Yes        | Add context, validate prompts           |
| `AfterAgent`          | After the model responds                       | Yes        | Review output, force retry              |
| `BeforeModel`         | Before sending request to the LLM              | Yes        | Modify prompts, mock responses          |
| `AfterModel`          | After receiving LLM response                   | Yes        | Filter/redact responses                 |
| `BeforeToolSelection` | Before the LLM selects tools                   | No         | Filter available tools                  |
| `BeforeTool`          | Before a tool executes                         | Yes        | Validate arguments, block dangerous ops |
| `AfterTool`           | After a tool executes                          | Yes        | Process results, inject context         |
| `PreCompress`         | Before context compression                     | No         | Save state, notify user                 |
| `Notification`        | When a system notification occurs              | No         | Forward alerts, logging                 |

## Next steps

* [Configuration](/main/getting-started/tabnine-cli/features/hooks/configuration) — Settings schema, matchers, multiple hooks, and CLI commands.
* [Event Reference](/main/getting-started/tabnine-cli/features/hooks/event-reference) — Detailed input/output fields for all 11 events.
* [Examples & Best Practices](/main/getting-started/tabnine-cli/features/hooks/examples-and-best-practices) — Copy-paste recipes, security model, and testing tips.


# Configuration

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

Hooks are configured in `settings.json`, **not** in `TABNINE.md`. Tabnine CLI merges configurations from multiple layers (highest to lowest precedence):

1. **Project settings**: `.tabnine/agent/settings.json` in the project root.
2. **User settings**: `~/.tabnine/agent/settings.json`.
3. **System settings**: Platform-specific system config directory.
4. **Extensions**: Hooks defined by installed extensions.

## Configuration schema

```json
{
  "hooksConfig": {
    "enabled": true,
    "disabled": [],
    "notifications": true
  },
  "hooks": {
    "BeforeTool": [
      {
        "matcher": "write_file|replace",
        "sequential": true,
        "hooks": [
          {
            "type": "command",
            "command": "node $TABNINE_PROJECT_DIR/hooks/validate-write.js",
            "name": "validate-write",
            "description": "Validate file writes before execution",
            "timeout": 5000
          }
        ]
      }
    ]
  }
}
```

## `hooksConfig` fields

| Field           | Type       | Default | Description                                                                           |
| --------------- | ---------- | ------- | ------------------------------------------------------------------------------------- |
| `enabled`       | `boolean`  | `true`  | Master toggle for the hooks system. Set to `false` to disable all.                    |
| `disabled`      | `string[]` | `[]`    | List of hook identifiers to skip. Matches against `name` if set, otherwise `command`. |
| `notifications` | `boolean`  | `true`  | Show visual indicators when hooks execute.                                            |

## Hook definition fields

Each event contains an array of **hook definitions**:

| Field        | Type      | Required | Description                                                                                                         |
| ------------ | --------- | -------- | ------------------------------------------------------------------------------------------------------------------- |
| `matcher`    | `string`  | No       | A regex for tool events (`BeforeTool`, `AfterTool`) or exact string for lifecycle events. Omit to match everything. |
| `sequential` | `boolean` | No       | If `true`, hooks in this group run sequentially. If `false` (default), they run in parallel.                        |
| `hooks`      | `array`   | **Yes**  | An array of **hook configurations** (see below).                                                                    |

## Hook configuration fields

| Field         | Type                     | Required | Description                                                                    |
| ------------- | ------------------------ | -------- | ------------------------------------------------------------------------------ |
| `type`        | `string`                 | **Yes**  | Must be `"command"`. No default — hooks without `type` are silently discarded. |
| `command`     | `string`                 | **Yes**  | The shell command to execute.                                                  |
| `name`        | `string`                 | No       | A friendly identifier for logs and the `disabled` list.                        |
| `description` | `string`                 | No       | A brief explanation of the hook's purpose.                                     |
| `timeout`     | `number`                 | No       | Timeout in **milliseconds**. Default: `60000` (60 seconds).                    |
| `env`         | `Record<string, string>` | No       | Additional environment variables to set for this hook.                         |

## Matchers

The `matcher` field controls which specific tools or triggers fire your hook:

* **Tool events** (`BeforeTool`, `AfterTool`): Matchers are **regular expressions** (e.g., `"write_file|replace"`, `"read_.*"`).
* **Lifecycle events**: Matchers are **exact strings** (e.g., `"startup"` for `SessionStart`).
* **Match all**: Omit `matcher` or set to `".*"` to match everything.

### Tool naming conventions

* **Built-in tools**: Match by their name (e.g., `read_file`, `run_shell_command`, `write_file`, `replace`).
* **MCP tools**: Follow the pattern `mcp_<server_name>_<tool_name>`.

## Multiple hooks

You can define multiple hooks for the same event. By default they run in parallel; set `sequential: true` to run them in order:

```json
{
  "hooks": {
    "BeforeTool": [
      {
        "matcher": ".*",
        "sequential": true,
        "hooks": [
          {
            "type": "command",
            "command": "node ./hooks/validate.js",
            "name": "validate"
          },
          {
            "type": "command",
            "command": "node ./hooks/log.js",
            "name": "log-tool"
          }
        ]
      }
    ]
  }
}
```

You can also define multiple hook definitions per event with different matchers:

```json
{
  "hooks": {
    "BeforeTool": [
      {
        "matcher": "write_file|replace",
        "hooks": [
          {
            "type": "command",
            "command": "node ./hooks/validate-writes.js"
          }
        ]
      },
      {
        "matcher": "run_shell_command",
        "hooks": [
          {
            "type": "command",
            "command": "node ./hooks/validate-commands.js"
          }
        ]
      }
    ]
  }
}
```


# Event Reference

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

This page documents the input and output fields for each hook event. For the base input schema and common output fields shared by all events, see [Hooks](/main/getting-started/tabnine-cli/features/hooks).

## `SessionStart`

Fires on application startup, when resuming a session, or after a `/clear` command.

**Additional input fields:**

| Field    | Type     | Values                             |
| -------- | -------- | ---------------------------------- |
| `source` | `string` | `"startup"`, `"resume"`, `"clear"` |

**Relevant output fields:**

* `hookSpecificOutput.additionalContext` (`string`): Injected as context into the session.
* `systemMessage`: Shown at the start of the session.

{% hint style="info" %}
Advisory only — `continue` and `decision` are ignored. Startup is never blocked.
{% endhint %}

**Example config:**

```json
{
  "hooks": {
    "SessionStart": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "node ./hooks/load-context.js",
            "name": "load-context",
            "timeout": 5000
          }
        ]
      }
    ]
  }
}
```

## `SessionEnd`

Fires when the CLI exits or a session is cleared.

**Additional input fields:**

| Field    | Type     | Values                                                            |
| -------- | -------- | ----------------------------------------------------------------- |
| `reason` | `string` | `"exit"`, `"clear"`, `"logout"`, `"prompt_input_exit"`, `"other"` |

{% hint style="info" %}
Best effort only — the CLI will not wait for this hook to complete.
{% endhint %}

## `BeforeAgent`

Fires after a user submits a prompt but before the agent begins planning.

**Additional input fields:**

| Field    | Type     | Description                  |
| -------- | -------- | ---------------------------- |
| `prompt` | `string` | The user's submitted prompt. |

**Relevant output fields:**

* `hookSpecificOutput.additionalContext` (`string`): Appended to the prompt for this turn.
* `decision: "deny"`: Blocks the turn and discards the user's message from history.
* `continue: false`: Blocks the turn but saves the message to history.

## `AfterAgent`

Fires after the model generates its final response for a turn.

**Additional input fields:**

| Field              | Type      | Description                                       |
| ------------------ | --------- | ------------------------------------------------- |
| `prompt`           | `string`  | The user's original prompt.                       |
| `prompt_response`  | `string`  | The final text generated by the agent.            |
| `stop_hook_active` | `boolean` | Whether this is already part of a retry sequence. |

**Relevant output fields:**

* `decision: "deny"`: Rejects the response and triggers a retry. `reason` is sent to the agent as a new prompt requesting correction.
* `hookSpecificOutput.clearContext` (`boolean`): If `true`, clears conversation history while preserving the UI display.

## `BeforeTool`

Fires before a tool is executed. Used for argument validation, security checks, and parameter rewriting.

**Additional input fields:**

| Field                   | Type     | Description                                                 |
| ----------------------- | -------- | ----------------------------------------------------------- |
| `tool_name`             | `string` | Name of the tool (e.g., `write_file`, `run_shell_command`). |
| `tool_input`            | `object` | The arguments generated by the model.                       |
| `mcp_context`           | `object` | Optional metadata for MCP-based tools.                      |
| `original_request_name` | `string` | Original tool name if this is a tail tool call.             |

**Relevant output fields:**

* `decision: "deny"`: Prevents the tool from executing. `reason` is sent to the agent as a tool error.
* `hookSpecificOutput.tool_input` (`object`): Replaces the model's arguments before execution. Must include **all** required tool parameters (not just the ones you want to change), because the CLI validates the complete object. Merge the original `tool_input` from stdin with your overrides: `{ ...input.tool_input, content: 'new value' }`.
* `continue: false`: Kills the entire agent loop.
* Exit code 2: Blocks execution; stderr is used as the reason.

## `AfterTool`

Fires after a tool executes. Used for result auditing, context injection, or hiding sensitive output.

**Additional input fields:**

| Field           | Type     | Description                                                                 |
| --------------- | -------- | --------------------------------------------------------------------------- |
| `tool_name`     | `string` | Name of the tool.                                                           |
| `tool_input`    | `object` | The original arguments.                                                     |
| `tool_response` | `object` | The result, containing `llmContent`, `returnDisplay`, and optional `error`. |

**Relevant output fields:**

* `decision: "deny"`: Hides the real tool output. `reason` replaces the result sent to the model.
* `hookSpecificOutput.additionalContext` (`string`): Appended to the tool result for the agent.
* `hookSpecificOutput.tailToolCallRequest` (`{ name, args }`): Execute another tool immediately after this one; its result replaces the original response.

## `BeforeModel`

Fires before sending a request to the LLM.

**Additional input fields:**

| Field         | Type     | Description                                           |
| ------------- | -------- | ----------------------------------------------------- |
| `llm_request` | `object` | Contains `model`, `messages`, `config`, `toolConfig`. |

**Relevant output fields:**

* `hookSpecificOutput.llm_request` (`object`): Overrides parts of the outgoing request (e.g., changing model or temperature).
* `hookSpecificOutput.llm_response` (`object`): A synthetic response. If provided, the LLM call is skipped entirely.
* `decision: "deny"`: Blocks the request and aborts the turn.

## `AfterModel`

Fires after receiving an LLM response chunk.

**Additional input fields:**

| Field          | Type     | Description                      |
| -------------- | -------- | -------------------------------- |
| `llm_request`  | `object` | The original request.            |
| `llm_response` | `object` | The model's response (or chunk). |

**Relevant output fields:**

* `hookSpecificOutput.llm_response` (`object`): Replaces the model's response chunk.
* `decision: "deny"`: Discards the response chunk and blocks the turn.

{% hint style="info" %}
**Note**: This fires for **every chunk** during streaming. Modifications only affect the current chunk.
{% endhint %}

## `BeforeToolSelection`

Fires before the LLM decides which tools to call. Used to filter the available toolset.

**Additional input fields:**

| Field         | Type     | Description                   |
| ------------- | -------- | ----------------------------- |
| `llm_request` | `object` | Same format as `BeforeModel`. |

**Relevant output fields:**

* `hookSpecificOutput.toolConfig.mode` (`"AUTO" | "ANY" | "NONE"`):
  * `"NONE"`: Disables all tools (wins over other hooks).
  * `"ANY"`: Forces at least one tool call.
* `hookSpecificOutput.toolConfig.allowedFunctionNames` (`string[]`): Whitelist of tool names. Multiple hooks' whitelists are combined.

{% hint style="info" %}
Does **not** support `decision`, `continue`, or `systemMessage`.
{% endhint %}

## `PreCompress`

Fires before the CLI summarizes history to save tokens.

**Additional input fields:**

| Field     | Type     | Values                 |
| --------- | -------- | ---------------------- |
| `trigger` | `string` | `"auto"` or `"manual"` |

{% hint style="info" %}
Advisory only — fired asynchronously. Cannot block or modify compression.
{% endhint %}

## `Notification`

Fires when the CLI emits a system alert (e.g., tool permission request).

**Additional input fields:**

| Field               | Type     | Description                                      |
| ------------------- | -------- | ------------------------------------------------ |
| `notification_type` | `string` | Type of notification (e.g., `"ToolPermission"`). |
| `message`           | `string` | Summary of the alert.                            |
| `details`           | `object` | Alert-specific metadata.                         |

{% hint style="info" %}
Observability only — cannot block alerts or grant permissions.
{% endhint %}


# Examples & Best Practices

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

Copy-paste hook recipes, security model, and testing tips for Tabnine CLI.

## Examples

### Blocking dangerous shell commands

**`.tabnine/agent/settings.json`**

```json
{
  "hooks": {
    "BeforeTool": [
      {
        "matcher": "run_shell_command",
        "sequential": true,
        "hooks": [
          {
            "type": "command",
            "command": "node ./hooks/block-dangerous.js",
            "name": "block-dangerous",
            "description": "Block dangerous shell commands"
          }
        ]
      }
    ]
  }
}
```

**`hooks/block-dangerous.js`**

```javascript
let data = '';
process.stdin.on('data', (chunk) => { data += chunk; });
process.stdin.on('end', () => {
  const input = JSON.parse(data);
  const cmd = input.tool_input?.command || '';

  if (cmd.includes('rm -rf') || cmd.includes('sudo')) {
    // Block via JSON output (preferred over exit code 2)
    process.stdout.write(JSON.stringify({
      decision: 'deny',
      reason: 'Blocked dangerous command: ' + cmd
    }));
  } else {
    process.stdout.write(JSON.stringify({ decision: 'allow' }));
  }
});
```

### Restricting file writes to a directory

**`hooks/enforce-directory.js`**

```javascript
let data = '';
process.stdin.on('data', (chunk) => { data += chunk; });
process.stdin.on('end', () => {
  const input = JSON.parse(data);

  if (input.tool_name === 'write_file') {
    const filePath = input.tool_input.file_path;
    if (!filePath.startsWith('/allowed/dir/')) {
      process.stdout.write(JSON.stringify({
        decision: 'deny',
        reason: 'File writes only allowed under /allowed/dir/'
      }));
      return;
    }
  }

  process.stdout.write(JSON.stringify({ decision: 'allow' }));
});
```

### Logging all tool calls

**`.tabnine/agent/settings.json`**

```json
{
  "hooks": {
    "AfterTool": [
      {
        "matcher": ".*",
        "hooks": [
          {
            "type": "command",
            "command": "node ./hooks/log-tools.js",
            "name": "tool-logger"
          }
        ]
      }
    ]
  }
}
```

**`hooks/log-tools.js`**

```javascript
const fs = require('fs');
let data = '';
process.stdin.on('data', (chunk) => { data += chunk; });
process.stdin.on('end', () => {
  const input = JSON.parse(data);
  const line = `[${input.timestamp}] ${input.tool_name}: ${JSON.stringify(input.tool_input)}
`;
  fs.appendFileSync('tool-log.txt', line);
  process.exit(0);
});
```

### Adding context to every prompt

**`.tabnine/agent/settings.json`**

```json
{
  "hooks": {
    "BeforeAgent": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "node ./hooks/add-context.js",
            "name": "project-context",
            "timeout": 5000
          }
        ]
      }
    ]
  }
}
```

**`hooks/add-context.js`**

```javascript
const { execSync } = require('child_process');
let data = '';
process.stdin.on('data', (chunk) => { data += chunk; });
process.stdin.on('end', () => {
  const input = JSON.parse(data);
  const context = `Current time: ${new Date().toISOString()}
`
    + `Git branch: ${execSync('git branch --show-current').toString().trim()}
`;

  process.stdout.write(JSON.stringify({
    hookSpecificOutput: { additionalContext: context }
  }));
});
```

### Auto-running linter after file changes

**`.tabnine/agent/settings.json`**

```json
{
  "hooks": {
    "AfterTool": [
      {
        "matcher": "write_file|replace",
        "sequential": true,
        "hooks": [
          {
            "type": "command",
            "command": "node ./hooks/auto-lint.js",
            "name": "auto-lint",
            "description": "Run linter after file modifications",
            "timeout": 10000
          }
        ]
      }
    ]
  }
}
```

**`hooks/auto-lint.js`**

```javascript
const { execSync } = require('child_process');
let data = '';
process.stdin.on('data', (chunk) => { data += chunk; });
process.stdin.on('end', () => {
  const input = JSON.parse(data);
  const filePath = input.tool_input?.file_path;

  if (filePath && filePath.endsWith('.ts')) {
    try {
      execSync(`npx eslint --fix "${filePath}"`, { stdio: 'pipe' });
      process.stdout.write(JSON.stringify({
        hookSpecificOutput: {
          additionalContext: `Linter ran on ${filePath}`
        }
      }));
    } catch (e) {
      process.stdout.write(JSON.stringify({
        hookSpecificOutput: {
          additionalContext: `Lint errors found in ${filePath}: ${e.stderr?.toString() || ''}`
        }
      }));
    }
  } else {
    process.exit(0);
  }
});
```

## Security and trust

{% hint style="warning" %}
Hooks execute arbitrary code with your user privileges.

**Project-level hooks** (in `.tabnine/agent/settings.json` within a project) are particularly risky when opening untrusted projects. Tabnine CLI **fingerprints** project hooks — if a hook's command changes (e.g., via `git pull`), it is treated as a **new, untrusted hook** and a warning is displayed before execution.

Untrusted folders will not have their project-level hooks loaded. Use the `/permissions` command in the CLI to manage folder trust.
{% endhint %}

## Best practices

{% stepper %}
{% step %}
**Keep hooks fast**

Hooks run synchronously and block the agent loop. Aim for sub-second execution. Use the `timeout` field to prevent hangs.
{% endstep %}

{% step %}
**Always output valid JSON to stdout**

Any non-JSON output to stdout will cause the hook to be treated as a plain-text system message with "allow" decision.
{% endstep %}

{% step %}
**Use stderr for logging**

Never use `console.log()` or `echo` for debug output — use `console.error()` or `>&2` to write to stderr instead.
{% endstep %}

{% step %}
**Prefer exit code 0 with `decision: "deny"` over exit code 2**

For intentional blocks, exit code 0 with JSON output gives you full control over the feedback message and behavior.
{% endstep %}

{% step %}
**Use descriptive `name` fields**

The name appears in logs and can be used in `hooksConfig.disabled` to selectively turn off hooks without removing them.
{% endstep %}

{% step %}
**Test hooks independently**

Before adding them to settings:

```bash
echo '{"hook_event_name":"BeforeTool","tool_name":"write_file","tool_input":{"file_path":"test.txt","content":"hello"},"cwd":"/tmp","session_id":"test","timestamp":"2025-01-01T00:00:00.000Z"}' | node ./hooks/my-hook.js
```

{% endstep %}

{% step %}
**Set the `sequential` flag**

Use it when hook execution order matters (e.g., a validation hook must run before a logging hook).
{% endstep %}

{% step %}
**Read stdin via the stream API**

Use `process.stdin.on('data', ...)` rather than `fs.readFileSync('/dev/stdin')` for cross-platform compatibility.
{% endstep %}
{% endstepper %}


# Agent Skills

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

Agent skills are reusable, user-defined instruction sets that extend Tabnine CLI's capabilities. Each skill provides specialized knowledge, workflows, or domain-specific behaviors that the agent can activate on demand. Unlike `TABNINE.md` project instructions (which load automatically on every session), skills load only when relevant, keeping the agent's context efficient.

## Skill Structure

A skill is a `SKILL.md` file placed inside a named directory. The file must include a YAML frontmatter block with `name` and `description` fields, followed by free-form markdown instructions.

```yaml
---
name: my-skill
description: A brief description of when this skill should be activated
---

# My Skill Instructions

Detailed procedural instructions go here...
```

The `description` field is critical — it determines when the agent will activate the skill. Write it to clearly describe the situations or requests that should trigger it.

Resource files (templates, schemas, reference docs) can be placed alongside `SKILL.md` in the same directory. When the skill is activated, the agent gains read access to the entire skill directory and can use these files as reference material. Resource files do not need to be declared in frontmatter.

The recommended directory layout follows the [Agent Skills convention](https://agentskills.io/):

```
my-skill/
├── SKILL.md          # Required: metadata + instructions
├── scripts/          # Optional: executable code (Node.js, Python, Bash)
├── references/       # Optional: documentation loaded into context as needed
├── assets/           # Optional: templates, icons, fonts, boilerplate
└── ...               # Any additional files or directories
```

The subdirectory names are a convention, not a requirement. The agent has access to the entire skill directory regardless of how files are organized.

## How Skills Work

Skills follow a simple lifecycle. The agent matches a user request to an available skill based on the skill's description. When a match is found, the agent activates the skill using the `activate_skill` tool, which loads the full instructions and makes the skill's directory contents available as resources. The agent then follows the skill's procedural guidance for the duration of the task.

Skills can also be activated explicitly by asking the agent to use a specific skill by name (for example, "use the code-reviewer skill to review my changes").

## Skill Locations

Skills are discovered from multiple locations, listed here from lowest to highest precedence. When skills share the same name, higher-precedence locations override lower ones.

| Priority    | Scope               | Path                                              |
| ----------- | ------------------- | ------------------------------------------------- |
| 1 (lowest)  | Built-in            | Bundled with the CLI                              |
| 2           | Extension           | Provided by installed extensions                  |
| 3           | User (primary)      | `~/.tabnine/agent/skills/<name>/SKILL.md`         |
| 4           | User (alias)        | `~/.agents/skills/<name>/SKILL.md`                |
| 5           | Workspace (primary) | `<project>/.tabnine/agent/skills/<name>/SKILL.md` |
| 6 (highest) | Workspace (alias)   | `<project>/.agents/skills/<name>/SKILL.md`        |

Workspace-level skills are only loaded when the workspace folder is trusted. If the folder is not trusted, workspace skills are silently skipped.

The skill loader searches each directory for `SKILL.md` files at the root level or one subdirectory deep (matching the patterns `SKILL.md` and `*/SKILL.md`).

## Managing Skills from the Terminal

The `tabnine skills` command provides skill management outside of interactive sessions.

```bash
# List all discovered skills
tabnine skills list

# Include built-in skills in the listing
tabnine skills list --all

# Install a skill from a Git repository
tabnine skills install https://github.com/user/repo.git

# Install a specific skill from a monorepo subdirectory
tabnine skills install https://github.com/org/skills.git --path skills/frontend

# Install from a local directory
tabnine skills install /path/to/local/skill

# Install from a .skill package file
tabnine skills install path/to/my-skill.skill

# Install to workspace scope instead of user scope
tabnine skills install /path/to/skill --scope workspace

# Link a skill (symlink — edits to the source files are picked up on the next session or after /skills reload)
tabnine skills link /path/to/my-skills-repo

# Link to workspace scope
tabnine skills link /path/to/skills --scope workspace

# Uninstall a skill by name
tabnine skills uninstall my-skill

# Uninstall from workspace scope
tabnine skills uninstall my-skill --scope workspace

# Enable a previously disabled skill
tabnine skills enable my-skill

# Disable a skill (defaults to workspace scope)
tabnine skills disable my-skill

# Disable in user scope
tabnine skills disable my-skill --scope user
```

The `install` and `link` commands accept a `--consent` flag to skip the interactive security confirmation prompt, which is useful for CI/automation. Both default to user scope.

### Managing Skills in Interactive Mode

The `/skills` slash command provides skill management during an interactive session.

| Subcommand               | Description                                                                                                               |
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------- |
| `/skills list`           | Lists all discovered skills with descriptions. Append `nodesc` to hide descriptions, or `all` to include built-in skills. |
| `/skills link <path>`    | Links skills from a local directory via symlink. Accepts `--scope user` (default) or `--scope workspace`.                 |
| `/skills disable <name>` | Disables a skill by name.                                                                                                 |
| `/skills enable <name>`  | Re-enables a disabled skill.                                                                                              |
| `/skills reload`         | Refreshes discovered skills from all locations. Alias: `refresh`.                                                         |

Running `/skills` with no subcommand defaults to `list`.

### Managing Skills with `/memory inbox` Command

The `/memory inbox` command opens an interactive dialog for reviewing skills that Tabnine CLI has automatically extracted from your past sessions. From the inbox you can approve a skill (moving it to your global or project skills directory), edit its name and description before saving, or dismiss it.

To open the inbox, run:

```
/memory inbox
```

The inbox is part of the experimental memory manager. Enable it by adding the following to your settings:

```json
{
  "experimental": {
    "memoryManager": true
  }
}
```

If the memory manager is not enabled, `/memory inbox` will display a message with instructions to enable it.

{% hint style="info" %}
**Skill patching:** If a skill with the same name already exists in your skills directory, the inbox will offer to patch it rather than create a duplicate, merging the new content into the existing file.
{% endhint %}

### Disabling Skills

Skills can be disabled through the CLI commands above or by adding the skill name to the `skills.disabled` array in `settings.json`.

```json
{
  "skills": {
    "disabled": ["my-skill", "another-skill"]
  }
}
```

Disabled skills from both user and workspace settings are merged (union strategy). A skill disabled at any scope is disabled everywhere. Enabling a skill removes it from all writable scopes.

### Creating a Skill

The easiest approach is to ask the agent directly — Tabnine CLI includes a built-in `skill-creator` skill that scaffolds well-structured skills. Prompt it with requests like "Create a skill for reviewing database migrations" or "Make a skill that helps write API documentation following our team's format."

To create a skill manually, create a directory with a `SKILL.md` file containing the required frontmatter, place it in one of the discovery locations, and run `/skills reload` (interactive) or `tabnine skills list` (terminal) to pick it up.

### Packaging and Sharing Skills

Skills can be packaged into `.skill` files for distribution. A `.skill` file is a zip archive containing the skill directory, which can be shared with teammates or published to a registry.

#### Creating a Package

To package a skill for sharing, ask the agent: "Package my-skill into a .skill file." The built-in `skill-creator` skill handles scaffolding, validation, and packaging automatically.

#### Installing a Package

```bash
# Install to user scope (default)
tabnine skills install /path/to/my-skill.skill

# Install to workspace scope
tabnine skills install /path/to/my-skill.skill --scope workspace

# Skip the interactive security prompt (useful for CI)
tabnine skills install /path/to/my-skill.skill --consent
```

After installing, run `/skills reload` in an active session to pick up the new skill immediately.

#### Uninstalling

```bash
tabnine skills uninstall my-skill
```

#### Best Practices

* Write clear, specific descriptions so the agent activates the skill at the right time.
* Structure instructions as step-by-step procedures rather than general guidelines.
* Include concrete examples and templates in resource files when possible.
* Keep each skill focused on a single domain or task type.
* Test skills by asking the agent to perform the relevant task and verifying it follows the instructions correctly.


# Subagents

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

A subagent is a specialized agent that runs under the main Tabnine Agent. Each subagent focuses on a narrower domain, such as code review, security scanning, refactoring, or documentation. The main agent delegates specific tasks to subagents when that specialization improves the quality, accuracy, or clarity of the result.

### How Subagents Are Used <a href="#how-subagents-are-used" id="how-subagents-are-used"></a>

When you ask the agent to perform a complex or multi-step task, it may:

1. Decide that a particular part of the task is best handled by a subagent.
2. Route that part of the conversation or a specific tool call to the subagent.
3. Collect the subagent’s result and integrate it back into the overall answer.

You generally do not need to interact with subagents directly. Instead, you describe the outcome you want, and the system selects and coordinates the relevant subagents automatically.

### Relationship to Extensions <a href="#relationship-to-extensions" id="relationship-to-extensions"></a>

Subagents can be provided by:

* Core Tabnine functionality, bundled with the CLI.
* Installed extensions, which may define additional subagents specialized for particular tools, frameworks, or workflows.

When you enable or disable extensions, any subagents they define become available or unavailable accordingly.

> **Note:** Subagents are currently an experimental feature.

To use custom subagents, you must explicitly enable them in your `settings.json`:

```json
{
  "experimental": { "enableAgents": true }
}
```

**Warning:** Subagents currently operate in a “YOLO mode,” meaning they may execute tools without asking for confirmation for each individual action. Use caution when defining agents that can access powerful tools such as `run_shell_command` or `write_file`.

### What Are Subagents? <a href="#what-are-subagents" id="what-are-subagents"></a>

Subagents act as focused “specialists” that the main Tabnine Agent can call for particular kinds of work.

* **Focused context:** Each subagent has its own system prompt and persona.
* **Specialized tools:** Subagents can be configured with a limited or specialized set of tools.
* **Independent context window:** Interactions with a subagent occur in a separate context loop, which helps keep the main conversation history compact.

{% hint style="info" %}
Limits for `invoke_agent`: 20 turns for generalist, 50 turns for codebase\_investigator, 10 turns for remote-codebase-investigator, with a roughly 150k-token history window and 80k retained-token target for the agent context profile.
{% endhint %}

Subagents are exposed to the main agent as tools named after the subagent. When the main agent invokes one of these tools, it delegates the task to the corresponding subagent. After the subagent completes its work, it returns its findings to the main agent, which then incorporates them into the overall response.

### Built-in Subagents <a href="#built-in-subagents" id="built-in-subagents"></a>

Tabnine CLI includes several built-in subagents.

#### Codebase Investigator <a href="#codebase-investigator" id="codebase-investigator"></a>

* **Name:** `codebase_investigator`
* **Purpose:** Analyze the codebase, reverse engineer behavior, and understand complex dependencies.
* **When to use:** Questions such as “How does the authentication system work?” or “What are the dependencies of the `AgentRegistry` class?”
* **Configuration:** Enabled by default. You can configure it in `settings.json`. For example, to force a specific model:

```json
{
  "agents": {
    "overrides": {
      "codebase_investigator": {
        "enabled": true,
        "runConfig": { "maxTurns": 20 },
        "modelConfig": { "model": "..." }
      }
    }
  }
}
```

#### Remote Codebase Investigator <a href="#remote-codebase-investigator" id="remote-codebase-investigator"></a>

* **Name:** `remote-codebase-investigator`
* Purpose: Tabnine-only built-in subagent for investigating remote codebases
* **When to use:** Similar to `codebase_investigator` but for remote codebases
* **Configuration:** Available at runtime. Defined at `packages/core/src/tabnine/agents/subagents/remote-codebase-investigator.md` and registered in `registry.ts`

#### Generalist Agent <a href="#generalist-agent" id="generalist-agent"></a>

* **Name:** `generalist`
* **Purpose:** A general-purpose AI agent purpose-built for breadth — capable across all domains rather than specialized in one. Handles turn-intensive or data-heavy tasks on behalf of the main session, returning a single consolidated result to keep session history lean.
* **When to use:** Batch refactoring or fixes across many files, commands expected to produce high-volume output, or exploratory investigations with uncertain scope or many intermediate steps.
* **Configuration:** Enabled by default. No additional configuration options.

[*Go into more depth on the Generalist Agent >*](/main/getting-started/tabnine-cli/features/subagents/generalist-agent)

#### Browser Agent <a href="#browser-agent" id="browser-agent"></a>

* **Name:** `browser_agent`
* **Purpose:** Automate web browser tasks such as navigating websites, filling out forms, clicking buttons, and extracting information from web pages, using the browser’s accessibility tree.
* **When to use:** Scenarios like “Go to [Example Domain](http://example.com/) and fill out the contact form,” “Extract the pricing table from this page,” or “Click the login button and enter my credentials.”

> **Note:** This is a preview feature and is still under active development. It is disabled by default and must be activated in `settings.json`, as explained below.

**Prerequisites**

The browser agent requires:

* **Chrome** version 144 or later (any recent stable release is sufficient).
* **Node.js** with `npx` available (used to launch the `chrome-devtools-mcp` server).

**Enabling the Browser Agent**

The browser agent is disabled by default. Enable it in your `settings.json`:

```json
{
  "agents": {
    "overrides": {
      "browser_agent": {
        "enabled": true
      }
    }
  }
}
```

**Session Modes**

The `sessionMode` setting controls how Chrome is launched and managed. Configure it under `agents.browser`:

```json
{
  "agents": {
    "overrides": {
      "browser_agent": {
        "enabled": true
      }
    },
    "browser": {
      "sessionMode": "persistent"
    }
  }
}
```

The available modes are:

| Mode         | Description                                                                                                                                                                                |
| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `persistent` | **(Default)** Launches Chrome with a persistent profile stored at `~/.tabnine/agent/cli-browser-profile/`. Cookies, browsing history, and settings are preserved across sessions.          |
| `isolated`   | Launches Chrome with a temporary profile that is deleted after each session. Suitable when you require a clean environment for each run.                                                   |
| `existing`   | Attaches to an already running Chrome instance. You must enable remote debugging first by navigating to `chrome://inspect/#remote-debugging` in Chrome. No new browser process is started. |

**Configuration reference**

All browser-specific settings are configured under `agents.browser` in your `settings.json`.

| Setting       | Type      | Default        | Description                                                                    |
| ------------- | --------- | -------------- | ------------------------------------------------------------------------------ |
| `sessionMode` | `string`  | `"persistent"` | Controls how Chrome is managed: `"persistent"`, `"isolated"`, or `"existing"`. |
| `headless`    | `boolean` | `false`        | If `true`, runs Chrome in headless mode (no visible window).                   |
| `profilePath` | `string`  | —              | Optional custom path to a browser profile directory.                           |
| `visualModel` | `string`  | —              | Optional model override for the visual agent (for example, `"gpt-5.2-codex"`). |

**Security**

The browser agent enforces several security restrictions:

* **Blocked URL patterns:** `file://`, `javascript:`, `data:text/html`, `chrome://extensions`, and `chrome://settings/passwords` *may* be blocked by the external `chrome-devtools-mcp` package rather than by Tabnine CLI itself.
* **Sensitive action confirmation:** Actions such as form filling, file uploads, and form submissions may require explicit confirmation, in line with the policy configuration.

**Visual Agent**

By default, the browser agent interacts with pages through the accessibility tree, addressing elements by their `uid` values. For tasks that require visual identification (for example, “click the yellow button” or “locate the red error message”), you can enable the visual agent by setting a `visualModel`:

```json
{
  "agents": {
    "overrides": {
      "browser_agent": {
        "enabled": true
      }
    },
    "browser": {
      "visualModel": "gpt-5.2-codex"
    }
  }
}
```

When the visual agent is enabled, the browser agent gains access to the `analyze_screenshot` tool. This tool captures a screenshot and sends it to the vision model for analysis. The model returns coordinates and element descriptions that the browser agent uses together with the `click_at` tool for precise, coordinate-based interactions.

> **Note:** The visual agent requires API key or Vertex AI authentication and is not available when using Google Login.

### Creating Subagents <a href="#creating-subagents" id="creating-subagents"></a>

You can create your own subagents to automate specific workflows or enforce specific personas. To use custom subagents, ensure they are enabled in your `settings.json`:

```json
{
  "experimental": {
    "enableAgents": true
  }
}
```

#### Agent Definition Files <a href="#agent-definition-files" id="agent-definition-files"></a>

Custom agents are defined as Markdown (`.md`) files with YAML frontmatter. You can place them in:

1. **Project-level:** `.tabnine/agent/agents/*.md` (shared with your team)
2. **User-level:** `~/.tabnine/agent/agents/*.md` (personal agents)

#### File Format <a href="#file-format" id="file-format"></a>

Each file must begin with YAML frontmatter enclosed in triple dashes `---`. The body of the Markdown file becomes the agent’s system prompt.

**Example:** `.tabnine/``agents``/security-auditor.md`

```md
---
name: security-auditor
description: Specialized in finding security vulnerabilities in code.
kind: local
tools:
  - read_file
  - grep_search
model: gpt-5.2-codex
temperature: 0.2
max_turns: 10
---
You are a ruthless Security Auditor. Your job is to analyze code for potential
vulnerabilities.
Focus on:
1. SQL Injection
2. XSS (Cross-Site Scripting)
3. Hardcoded credentials
4. Unsafe file operations
When you find a vulnerability, explain it clearly and suggest a fix. Do not fix
it yourself; just report it.
```

#### Configuration Schema <a href="#configuration-schema" id="configuration-schema"></a>

| Field          | Type   | Required | Description                                                                                                                           |
| -------------- | ------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| `name`         | string | Yes      | Unique identifier (slug) used as the tool name for the agent. Must contain only lowercase letters, numbers, hyphens, and underscores. |
| `description`  | string | Yes      | Short description of what the agent does. Used by the main agent to decide when this subagent is appropriate.                         |
| `kind`         | string | No       | Either `local` (default) or `remote`.                                                                                                 |
| `tools`        | array  | No       | List of tool names that this agent can use. If omitted, it may inherit a default tool set.                                            |
| `model`        | string | No       | Specific model to use (for example, `gpt-5.2-codex`). Defaults to `inherit`, meaning it uses the main session model.                  |
| `temperature`  | number | No       | Model temperature (0.0–2.0).                                                                                                          |
| `max_turns`    | number | No       | Maximum number of conversation turns allowed for this agent before it must return. Defaults to `15`.                                  |
| `timeout_mins` | number | No       | Maximum execution time in minutes. Defaults to `5`.                                                                                   |

#### Optimizing your subagent <a href="#optimizing-your-subagent" id="optimizing-your-subagent"></a>

The main agent’s system prompt encourages it to rely on expert subagents when they are available. It decides whether a subagent is relevant based largely on that subagent’s description. You can improve how consistently a subagent is used by making its description clear about:

* Its area of expertise.
* When it should be preferred.
* Concrete example scenarios.

For example, the following description is likely to be chosen reliably for Git-related operations:

> Git expert agent that should be used for all local and remote git operations. For example: making commits, searching for regressions with bisect, and interacting with source control and issues providers such as GitHub.

If you want to fine-tune usage, select the model you want to optimize for (with `/model`), then ask the model why it did or did not call your subagent for a given prompt and description. Use that feedback to refine the description and examples.


# Generalist Agent

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

## **Generalist Agent**

The Generalist Agent in Tabnine CLI is a general-purpose sub-agent that handles turn-intensive or data-heavy tasks on behalf of the main session. It has access to the same tools as the primary agent, but runs as a delegated worker whose entire execution is consolidated into a single result — keeping the main session history lean and efficient.

This matters because the main session carries its full history with every turn. The larger that history grows, the more expensive each subsequent interaction becomes. Delegating heavy work to the Generalist Agent contains that cost without sacrificing capability.

### **When to use the Generalist Agent**

The Generalist Agent is invoked either manually (with the `/generalist` flag) or automatically by Tabnine CLI when a task is well-suited to delegation. You do not need to invoke it explicitly — the primary agent determines when to delegate based on the nature of the request.

Delegation is most appropriate for the following scenarios:

* Batch refactoring or fixes across many files (e.g., adding license headers, renaming symbols project-wide)
* Commands expected to produce high-volume output (e.g., verbose builds, exhaustive search results)
* Exploratory investigations with uncertain scope or many intermediate steps

For simple, surgical tasks — single-file edits, direct questions, or changes that can be resolved in one or two steps — the primary agent handles the work directly. Delegation is an efficiency tool, not a default.

### **How it works**

When the primary agent delegates a task, the Generalist Agent executes it in full using the complete toolset. The primary agent receives a single consolidated summary of the work done, rather than a turn-by-turn trace. This keeps the main session history short and subsequent interactions fast.

The Generalist Agent is not a separate mode you configure. It is an internal capability that Tabnine CLI uses as part of its normal operation and has access to the full Tabnine CLI toolset.

### **Relationship to other agents**

Tabnine CLI includes several specialized sub-agents. The Generalist Agent is purpose-built for breadth — capable across all domains rather than specialized in one.

| Agent                            | Best used for                                                  |
| -------------------------------- | -------------------------------------------------------------- |
| **Generalist Agent**             | Batch tasks, high-volume output, exploratory investigation     |
| **Codebase Investigator**        | Architecture mapping, dependency analysis, root-cause research |
| **Remote Codebase Investigator** | Cross-repo search, remote codebase analysis                    |

### **Limitations**

Because the Generalist Agent's execution is returned to the main session as a single consolidated summary, you do not get a turn-by-turn trace of the steps it took. If you need full visibility into every action the agent performs — for example, for audit or compliance purposes — run the task directly in the main session instead of delegating it.


# Agent Guidelines (CLI)

Agent guidelines are managed differently in Tabnine CLI than they are for the Tabnine IDE plugin.

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

Agent guidelines (a.k.a. "coaching guidelines") are managed differently in Tabnine CLI than they are for the Tabnine IDE plugin. Guidelines in Tabnine CLI are applied through Tabnine-provided context and tools.

{% hint style="info" %}
Go to the following hyperlink to manage [Agent Guidelines in the Tabnine IDE plugin](/main/getting-started/tabnine-agent/guidelines).
{% endhint %}

Guidelines help Tabnine CLI align its responses with your organization's engineering standards. When guidelines are available for your authenticated account or organization, Tabnine CLI can use them while planning, writing code, reviewing code, and answering questions about coding standards.

### How Agent Guidelines Work in Tabnine CLI

Tabnine CLI supports two guideline flows.

First, organization instructions and service-account instructions are added to the agent's operating context. These instructions are configured outside the CLI by your Tabnine administrator. When Tabnine CLI starts, it fetches the available instructions for your authenticated account and applies them to the session. Service-account instructions only apply when they are configured for the authenticated service account.

Second, coding guidelines are available through the built-in **Tabnine Coaching Guidelines** tool. When the tool is enabled, the agent can fetch language-specific rules before it writes code, reviews code, or answers questions about your team's standards.

These flows are separate. *Organization and service-account instructions* are fetched automatically from your Tabnine account context. The Coaching Guidelines *setting* controls only the built-in Coaching Guidelines MCP server.

### Requirements

You need to be signed in to Tabnine CLI with an account that has access to your organization's Tabnine environment. Your Tabnine server must also support Coaching Guidelines for CLI use if you want the agent to fetch language-specific coding rules during a session.

The built-in Coaching Guidelines tool is enabled by default. If it has been disabled, you can enable it from the `/settings` dialog.

### Enable or Disable Coaching Guidelines

In an interactive Tabnine CLI session, open settings:

```
/settings
```

Find **Enable Tabnine Coaching Guidelines** under the listed tools. This setting controls whether Tabnine CLI loads the built-in Coaching Guidelines MCP server.

{% hint style="warning" %}
This setting *doesn't* control whether organization or service-account instructions are fetched and added to the session context.
{% endhint %}

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2FDFriGWQXPe01w3WVqUTd%2Ftabnine-cli-guidelines.png?alt=media&amp;token=fafaed76-7f3c-48a6-8d6a-9073bd7cd9f8" alt=""><figcaption></figcaption></figure>

The setting is stored as:

```json
{
  "tools": {
    "enableCoaching": true
  }
}
```

Changing this setting requires restarting Tabnine CLI.

### Availability and Fallback Behavior

If Tabnine CLI cannot fetch organization or service-account instructions, the session continues without them. If Coaching Guidelines are not supported by your Tabnine server, the built-in Coaching Guidelines tool is not loaded.

If you ask for guideline-based review and no guidelines are available, Tabnine CLI should tell you that it cannot access configured guidelines instead of inventing rules.

### Troubleshooting

If language-specific coding guidelines do not appear to be applied, check that **Enable Tabnine Coaching Guidelines** is turned on in `/settings`, and that you restarted the CLI after changing the setting.

You can also ask Tabnine CLI whether the Coaching Guidelines tool appears to be available in the current session. This is a practical check, not a standalone status command.

***Example: Check availability***

```
Can you check whether Tabnine Coaching Guidelines appear to be available in this session?
```


# Web Fetch

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

### What Web Fetch Does <a href="#what-web-fetch-does" id="what-web-fetch-does"></a>

The Web Fetch tool allows the Tabnine Agent to retrieve content from specific web pages, analyze it, and use that information when responding to your requests. It is especially useful when you need documentation or API references that exist only on public websites, recent blog posts, changelogs, or release notes, or examples, tutorials, or configuration snippets from public documentation or blogs.

#### Enabling Web Fetch <a href="#enabling-web-fetch" id="enabling-web-fetch"></a>

Web Fetch is disabled by default. You can enable it in two ways:

1. Via the `/settings` menu: Type `/settings` in the CLI, navigate to the **Tools** category, and toggle **Enable Web Fetch Tool** on.
2. Via `settings.json`: Add the following to your settings file, for example `~/.tabnine/agent/settings.json`:

```json
{
  "tools": {
    "enableWebFetchTool": true
  }
}
```

A restart of Tabnine CLI is required after changing this setting.

When Web Fetch is enabled, the agent can decide to use it automatically when your prompt contains one or more URLs and the task clearly depends on information that is not already available in your local context or configured tools. The fetched content is then summarized, filtered for relevance, and incorporated into the agent’s response.

When using Web Fetch, the agent prefers technical documentation and references over marketing or promotional sections of the same page. Web Fetch is not a general‑purpose web crawler; it only reads the URLs you provide and may sometimes follow obvious “next” or “previous” links in the same documentation flow.

### Usage Examples <a href="#usage-examples" id="usage-examples"></a>

You don’t need to “call” the Web Fetch tool directly; you just:

1. Ask your question in natural language, *and*
2. Include one or more URLs that the agent should use.

#### Example prompts:

* “Read the documentation at this URL and tell me how to configure OAuth: `<https://example.com/docs/oauth`.”>
* “Compare the breaking changes between version 5.0 and 6.0 in the framework’s release notes at these URLs.”
* “Use this tutorial to create a minimal working example for my project: `<https://example.com/blog/tutorial`.”>
* “Check this API reference page and generate a sample cURL request for the `createUser` endpoint.”

When you provide URLs, the agent will decide whether Web Fetch is needed, retrieve the page content, then summarize and extract the details relevant to your instructions.\
If Web Fetch is disabled or cannot access the URL, the agent will fall back to its existing context and will note that web content could not be retrieved when this affects the answer.

#### Technical Reference <a href="#technical-reference" id="technical-reference"></a>

**Arguments**

The Web Fetch tool takes a single structured request that includes:

* A natural language instruction (what you want done with the pages), and
* A list of one or more URLs to fetch.

Recommended constraints:

* No more than 20 URLs per request.
* Start URLs with `<http://`> or `<https://`.>

**Example (Conceptual Schema)**

```json
{
  "prompt": "Summarize the authentication section and list all required headers.",
  "urls": [
    "https://example.com/docs/api/authentication"
  ]
}
```

### Limitations <a href="#limitations" id="limitations"></a>

* Binary files (images, PDFs, etc.) have limited support and require enabling the experimental Direct Fetch mode (see below)
* Only publicly accessible URLs are supported; localhost and private network addresses are blocked
* Rate limited to 10 requests per minute per host
* Content is limited to 250KB per fetch (10MB in Direct Fetch mode)

#### Advanced: Direct Fetch Mode (Experimental) <a href="#advanced-direct-fetch-mode-experimental" id="advanced-direct-fetch-mode-experimental"></a>

An experimental direct fetch mode is available that fetches URLs locally via HTTP instead of sending them through the LLM API. This mode supports additional content types including images, PDFs, and video, with a higher 10MB size limit.

You can enable it in two ways:

1. Via the `/settings` menu: Type `/settings`, and toggle **Direct Web Fetch** on.
2. Via `settings.json`:

```json
{
  "experimental": {
    "directWebFetch": true
  }
}
```

Note: `tools.enableWebFetchTool` must also be enabled for this to work. A restart is required.

### Privacy <a href="#privacy" id="privacy"></a>

* The URL is sent to the LLM API for processing (or fetched locally when using Direct Fetch mode)


# Telemetry

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

Tabnine CLI includes optional, built-in telemetry powered by [OpenTelemetry](https://opentelemetry.io/). When enabled, it emits structured traces, metrics, and logs to an OTLP endpoint or local file of your choice — giving you full visibility into agent behavior, performance, and reliability.

Telemetry is **disabled by default** and must be explicitly enabled.

{% hint style="info" %}
\*\*Prerequisites:\*\* Tabnine CLI does not include a built-in telemetry backend.

To use telemetry, you must provide your own [OTLP-compatible](https://opentelemetry.io/ecosystem/vendors/) collector (e.g., Jaeger, Grafana, Datadog) or configure a local output file.
{% endhint %}

#### **What is Collected**

When telemetry is enabled, the following data is emitted:

* **Session metadata** - session ID, timestamps, and duration.
* **Feature usage** - which commands and tools are invoked, how often, and whether they succeed or fail.
* **Performance metrics** - API call latency, token usage (input/output), tool call durations, and memory usage.
* **Environment information** - operating system, Node.js version, CLI version, and process command-line arguments.
* **Error details** - error messages, error types, and HTTP status codes.
* **API request details** - model name, prompt ID, and request text for each API call.
* **Prompt content** - when `logPrompts` is `true` (the default), user prompts and full conversation messages are included in log attributes. See Prompt logging for details on controlling this.

**What is NOT collected**

Tabnine CLI does not intentionally collect personal information or credentials. Your authentication tokens are never included in telemetry payloads.

{% hint style="warning" %}
\*\*Important:\*\* Telemetry may include user-generated content such as prompts, conversation messages, API request text, and process command-line arguments.

These fields are captured as-is, without redaction. If your input contains personal data or sensitive values, that content will be present in the telemetry output.

To limit exposure, disable prompt logging (`logPrompts: false`) and ensure telemetry is only sent to endpoints you trust. See Prompt logging for details
{% endhint %}

#### **Configuration**

Telemetry is configured through the settings file and/or environment variables. Environment variables take precedence over settings file values.

**Settings File**

Add a `telemetry` section to `~/.tabnine/agent/settings.json`:

```json
{
  "telemetry": {
    "enabled": true,
    "otlpEndpoint": "http://localhost:4317",
    "otlpProtocol": "grpc",
    "logPrompts": false
  }
}
```

{% hint style="info" icon="exclamation" %}
Note that this section may look different depending on your choice of variables as described in the options below.
{% endhint %}

**Configuration Reference**

| Setting        | Env Variable                      | Description                                                                                                       | Default                 |
| -------------- | --------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------- |
| `enabled`      | `TABNINE_TELEMETRY_ENABLED`       | Enable or disable telemetry. Only `true` and `1` enable it; any other value (including `false`, `0`) disables it. | `false`                 |
| `otlpEndpoint` | `TABNINE_TELEMETRY_OTLP_ENDPOINT` | OTLP collector endpoint URL.                                                                                      | `http://localhost:4317` |
| `otlpProtocol` | `TABNINE_TELEMETRY_OTLP_PROTOCOL` | OTLP transport protocol: `grpc` or `http`.                                                                        | `grpc`                  |
| `outfile`      | `TABNINE_TELEMETRY_OUTFILE`       | Write telemetry to a local file instead of sending to `otlpEndpoint`.                                             | —                       |
| `logPrompts`   | `TABNINE_TELEMETRY_LOG_PROMPTS`   | Include user prompts and messages in log attributes. Only `true` and `1` enable it; any other value disables it.  | `true`                  |

The standard OpenTelemetry variable `OTEL_EXPORTER_OTLP_ENDPOINT` is also supported. Resolution order: `TABNINE_TELEMETRY_OTLP_ENDPOINT` > `OTEL_EXPORTER_OTLP_ENDPOINT` > settings file.

**Disabling Telemetry**

Telemetry is disabled by default. If you have previously enabled it and want to turn it off, set `enabled` to `false` in the settings file:

```json
{
  "telemetry": {
    "enabled": false
  }
}
```

Or via environment variable:

```shell
export TABNINE_TELEMETRY_ENABLED=false
```

**Writing Telemetry to a File**

The simplest way to inspect telemetry output is to write it to a local file:

```json
{
  "telemetry": {
    "enabled": true,
    "outfile": "/tmp/tabnine-telemetry.log"
  }
}
```

When `outfile` is set, telemetry is written to the specified file instead of being sent to an OTLP endpoint.

**Sending Telemetry to a Collector**

You can send telemetry to any [OpenTelemetry-compatible](https://opentelemetry.io/ecosystem/vendors/) backend as seen in this Jaeger example:

{% stepper %}
{% step %}
Start a local Jaeger instance:

```shell
docker run -d --name jaeger \
  -p 16686:16686 \
  -p 4317:4317 \
  jaegertracing/all-in-one:latest
```

{% endstep %}

{% step %}
Configure telemetry to point to the collector:

```json
{
  "telemetry": {
    "enabled": true,
    "otlpEndpoint": "http://localhost:4317"
  }
}
```

{% endstep %}

{% step %}
Open the Jaeger UI at \`<http://localhost:16686\\`> to explore traces.
{% endstep %}
{% endstepper %}

**Using HTTP instead of gRPC**

If your collector expects OTLP over HTTP:

```json
{
  "telemetry": {
    "enabled": true,
    "otlpEndpoint": "http://localhost:4318",
    "otlpProtocol": "http"
  }
}
```

#### **Telemetry Signals**

Tabnine CLI emits three types of OpenTelemetry signals:

**Traces**

Traces capture the full lifecycle of agent interactions:

* User prompt processing
* LLM API calls
* Tool execution (with timing and success/failure)
* Agent loop iterations

**Metrics**

Metrics provide aggregate performance data:

* Token usage (input/output)
* API response times
* Tool call durations and success rates
* Memory usage

**Logs**

Structured log records capture discrete events:

* Session start and end
* Individual tool calls
* API requests and responses
* Errors

**Prompt Logging**

By default, `logPrompts` is `true` — user prompts and full conversation messages are included in log attributes (`prompt`, `gen_ai.input.messages`).

Setting `logPrompts` to `false` removes these attributes:

```json
{
  "telemetry": {
    "enabled": true,
    "logPrompts": false
  }
}
```

Or via environment variable:

```shell
export TABNINE_TELEMETRY_LOG_PROMPTS=false
```

{% hint style="warning" %}
\*\*Privacy note:\*\* Even with \`logPrompts\` set to \`false\`, some prompt context may still appear in other telemetry fields (such as API request text and process command-line arguments). If complete prompt privacy is required, do not send telemetry to untrusted endpoints.
{% endhint %}


# Plan Mode

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

## **Plan Mode**

Plan Mode in Tabnine CLI is designed for sessions where you want the agent to research and design a solution before it makes any changes. It is especially useful when a request is broad in scope, involves architectural decisions, or requires understanding several parts of the codebase before a safe implementation path can be determined.

When Plan Mode is active, the agent operates in a *read-only* phase first. It inspects the codebase and maps dependencies before producing a structured plan for you to review.

Execution begins *only* after you approve the plan.

### **When to use Plan Mode**

This approach lets you understand what the Agent thinks you want it to do and how it plans to carry it out. This lets you instruct the Agents on specific changes to its plan before it implements it.

So, use Plan Mode when you want Tabnine CLI to think through a problem ***before*** it starts making changes. This is the right choice when you want to check that your instructions for a complex task/set of tasks was actually clear. This can reset the scope if need be, especially if changes would touch multiple parts of the codebase.

This mode is a good fit for the following scenarios:

* Designing a new feature across multiple modules
* Refactoring shared infrastructure with broad dependencies
* Scaffolding a new application before committing to a structure
* Reviewing the agent's strategy before allowing it to act on a large codebase

If your goal is simply to prevent the agent from acting without approval on a per-action basis, approval mode is usually a better fit. Plan Mode is best when you want the entire approach reviewed and confirmed before execution begins.

### **Quickstart**

1. /settings `command`
2. `--approval-mode=plan` argument
3. Shift+Tab or `/plan` in the CLI input box, followed by the goal written in natural language
4. Natural language instruction like “start a plan for…

```shell
tabnine --approval-mode plan -p "refactor the authentication module"
```

In headless or CI contexts, Plan Mode auto-approves the `enter_plan_mode` and `exit_plan_mode` tools and automatically switches to YOLO mode for execution.

**Configure in settings.json**

```json
{
  "tools": {
    "approvalMode": "plan"
  }
}
```

### **Tool Restrictions**

Plan Mode enforces strict safety policies to prevent accidental changes. During the planning phase, only the following tools are available:

* File inspection: `read_file`, `list_directory`, `glob`
* Search: `grep_search`
* Research sub-agents: `codebase_investigator`
* Interaction: `ask_user`
* MCP tools (read-only): Read-only MCP tools are allowed but require explicit confirmation
* Planning (write): `write_file` and replace are allowed only for `.md` files in the plans directory

All other tools, including shell execution and file modification — are blocked *until* you approve the plan and execution begins.

### **The Planning Workflow**

When Plan Mode is active, the agent follows a structured sequence before taking any action. Plans are written in a markdown file to review.

1. **Research:** – The agent reads files, searches the codebase, and maps relevant dependencies.
2. **Design:** – It produces a written plan describing what it intends to change and why.
3. **Review:** – The plan is presented to you. You can approve it, ask for revisions, or cancel.
   * **Collaborative Editing:** Press Ctrl+X to open the plan file directly in your configured external editor for collaborative editing — you can reorder or rewrite steps, or leave inline comments. Save and close; the agent will revise the plan based on detected changes and your feedback.
4. **Execution:** – Only after approval does the agent begin making changes, following the approved plan.

### **Different Approval Workflows to Plan Mode**

**Default Mode** (prompt for all actions)

```shell
tabnine --approval-mode default
```

**Auto-Edit Mode** (auto-approve edits, prompt for commands)

```shell
tabnine --approval-mode auto_edit
```


# Sandboxing

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

## **Sandboxing**

Sandboxing in Tabnine CLI is an OS-level process isolation mechanism that enforces hard filesystem and network boundaries around the CLI process itself. When sandbox mode is active, the CLI runs inside a process jail enforced by the operating system kernel — using macOS Seatbelt (`sandbox-exec`) on macOS, or a container runtime (Docker, Podman, or others) on Linux and Windows. The OS prevents the process from reading or writing outside permitted paths, regardless of what the AI agent attempts.

This is distinct from the tool-approval layer (controlled by `--approval-mode`), which governs which agent actions require your confirmation. See Tool Approval vs. Sandbox Mode for a full comparison.

***

### **How Sandbox Mode Works**

When you enable sandbox mode, Tabnine CLI re-launches itself as a child process inside a sandbox environment. The sandbox backend is selected automatically based on your platform:

1. **macOS** — Uses `sandbox-exec` (Apple Seatbelt), a kernel-enforced SBPL profile. No external tools required.
2. **Linux** — Prefers Docker, then Podman, then `lxc`, then `runsc` (gVisor).
3. **Windows** — Uses a native Windows sandboxing mechanism (`windows-native`).

You can also specify a backend explicitly instead of relying on auto-detection (see Configuration).

#### **Filesystem Isolation**

The sandbox restricts which paths the process can read from and write to. Write access is always limited to a defined allowlist regardless of strictness level. Read access varies by the macOS profile selected (see macOS Sandbox Profiles). On container-based backends, the working directory and `.tabnine` config paths are mounted into the container.

#### **Network Isolation**

Network access is controlled independently of filesystem isolation. Two modes are available:

* **Open** — All outbound network connections are permitted.
* **Proxied** — Only connections through a local proxy (listening on `localhost:8877`) are permitted. Set via `TABNINE_SANDBOX_PROXY_COMMAND`.

***

### **When to Use Sandbox Mode**

Use sandbox mode when you need an enforceable guarantee that the CLI process cannot access or modify files outside your working directory, or cannot make unrestricted network connections. Unlike approval mode, sandbox restrictions are enforced by the OS — the AI agent cannot bypass them even if it tries.

Sandbox mode is a strong fit for:

* Analyzing code from an untrusted or unfamiliar repository
* Running Tabnine CLI in a CI/CD pipeline with restricted system access
* Auditing a project for security issues in a controlled environment
* Ensuring the CLI cannot touch files outside the current project directory
* Working in environments where a security team requires verifiable process isolation

If your goal is to review and approve each agent action interactively (rather than enforce hard OS-level boundaries), `--approval-mode default` is usually a better fit. Sandbox mode is stricter and non-interactive by design.

***

### **Quickstart**

**Enable sandboxing with a command flag**

```shell
tabnine -s -p "analyze the code structure"
```

**Use an environment variable**

*macOS/Linux*

```shell
export TABNINE_SANDBOX=true
tabnine -p "review the architecture"
```

*Windows (PowerShell)*

```
$env:TABNINE_SANDBOX="true"
tabnine -p "review the architecture"
```

**Configure in settings.json**

```json
{
  "tools": {
    "sandbox": true
  }
}
```

***

### **macOS Sandbox Profiles**

On macOS, the sandbox is implemented using Apple Seatbelt (`sandbox-exec`) with one of six built-in SBPL profiles. The profile controls how strictly filesystem access is constrained and whether network access is open or proxied.

Select a profile by setting the `SEATBELT_PROFILE` environment variable before invoking `tabnine`. If unset, the default is `permissive-open`.

| Profile                       | Read Access                                                                        | Write Access    | Network                       |
| ----------------------------- | ---------------------------------------------------------------------------------- | --------------- | ----------------------------- |
| `permissive-open` *(default)* | Everywhere (allow default)                                                         | Allowlist only¹ | All outbound                  |
| `permissive-proxied`          | Everywhere (allow default)                                                         | Allowlist only¹ | Proxied only (localhost:8877) |
| `restrictive-open`            | Explicit allowlist (target dir, system paths, \~/.tabnine, \~/.nvm, \~/.config, …) | Allowlist only¹ | All outbound                  |
| `restrictive-proxied`         | Same as `restrictive`                                                              | Allowlist only¹ | Proxied only (localhost:8877) |
| `strict-open`                 | Narrow allowlist (target dir + essential dotfiles + explicit system paths only)    | Allowlist only¹ | All outbound                  |
| `strict-proxied`              | Same as `strict`                                                                   | Allowlist only¹ | Proxied only (localhost:8877) |

¹ Write allowlist: working directory, system temp dir, `~/.tabnine`, `~/.cache`, `~/.npm`, `~/.gitconfig`, and any paths passed via `--include-directories` (up to 5).

```shell
# Use the most restrictive profile with proxied network
SEATBELT_PROFILE=strict-proxied tabnine -s -p "audit this codebase"
```

***

### **Tool Approval vs. Sandbox Mode**

These are two separate, independently configurable features that address different concerns.

|                             | `--sandbox` / `-s`                               | `--approval-mode`                                |
| --------------------------- | ------------------------------------------------ | ------------------------------------------------ |
| **What it controls**        | OS-level process isolation                       | Which AI agent actions require user confirmation |
| **Enforcement**             | Kernel / container runtime                       | CLI application logic                            |
| **Can the AI bypass it?**   | No                                               | No (but scope is different)                      |
| **Affects file writes?**    | Yes — OS blocks them outside allowlist           | Yes — prompts or auto-approves based on mode     |
| **Affects shell commands?** | Yes — restricted by the OS sandbox profile       | Yes — controlled by approval policy              |
| **Network restrictions?**   | Yes — open or proxied, per profile               | No                                               |
| **Requires external tool?** | On macOS: no. On Linux/Windows: Docker or Podman | No                                               |

**You can use both together.** For example, running with `-s --approval-mode default` gives you OS-level isolation *and* interactive confirmation of every agent action.

#### **Approval Mode Reference**

| Mode        | Behavior                                                          |
| ----------- | ----------------------------------------------------------------- |
| `default`   | Prompts for confirmation before every file edit and shell command |
| `auto_edit` | Auto-approves file edits; prompts for shell commands              |
| `yolo`      | Auto-approves everything (use with caution)                       |
| `plan`      | Agent plans actions and presents them; no automatic execution     |

```shell
# OS isolation + interactive confirmation of every action
tabnine -s --approval-mode default -p "your prompt"
```

***

### **Configuration**

#### **Enable Sandboxing (in order of precedence)**

1. **Command-line flag** — Pass `-s` or `--sandbox`.

```shell
tabnine -s -p "your prompt here"
```

2. **Environment variable** — Set `TABNINE_SANDBOX`.

*macOS/Linux*

```shell
export TABNINE_SANDBOX=true
tabnine -p "your prompt here"
```

*Windows (PowerShell)*

```
$env:TABNINE_SANDBOX="true"
tabnine -p "your prompt here"
```

You can also set `TABNINE_SANDBOX` to a specific backend name instead of `true`, which skips auto-detection:

| Value            | Effect                                                                  |
| ---------------- | ----------------------------------------------------------------------- |
| `true` or `1`    | Auto-detect backend (macOS: `sandbox-exec`; Linux: `docker` → `podman`) |
| `sandbox-exec`   | Force macOS Seatbelt (macOS only)                                       |
| `docker`         | Force Docker container backend                                          |
| `podman`         | Force Podman container backend                                          |
| `lxc`            | Force LXC container backend (Linux only)                                |
| `runsc`          | Force gVisor via Docker (Linux only; requires Docker)                   |
| `windows-native` | Force Windows native sandbox (Windows only)                             |

3. **Configuration file** — In `settings.json`, set `"sandbox"` under `"tools"`.

*Settings file location:*

* **macOS/Linux**: `~/.tabnine/agent/settings.json`
* **Windows**: `%USERPROFILE%\.tabnine\agent\settings.json`

**Boolean form** (auto-detect backend):

```json
{
  "tools": {
    "sandbox": true
  }
}
```

**String form** (specify backend explicitly):

```json
{
  "tools": {
    "sandbox": "docker"
  }
}
```

**Object form** (full control):

```json
{
  "tools": {
    "sandbox": {
      "enabled": true,
      "command": "docker",
      "networkAccess": false,
      "allowedPaths": ["/path/to/extra/dir"],
      "image": "your-org/custom-sandbox-image:latest"
    }
  }
}
```

| Field           | Type      | Default         | Description                                               |
| --------------- | --------- | --------------- | --------------------------------------------------------- |
| `enabled`       | boolean   | —               | Whether sandboxing is active                              |
| `command`       | string    | auto-detect     | Backend to use (`docker`, `podman`, `sandbox-exec`, etc.) |
| `networkAccess` | boolean   | `true`          | Set to `false` to block all outbound network              |
| `allowedPaths`  | string\[] | `[]`            | Additional filesystem paths to mount/allow                |
| `image`         | string    | Tabnine default | Custom container image (Docker/Podman only)               |

You can also set `sandboxNetworkAccess` as a top-level tools setting:

```json
{
  "tools": {
    "sandbox": true,
    "sandboxNetworkAccess": false
  }
}
```

#### **Additional Environment Variables**

| Variable                        | Description                                                                                                                                                               |
| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `SEATBELT_PROFILE`              | macOS only. Selects the Seatbelt profile: `permissive-open` *(default)*, `permissive-proxied`, `restrictive-open`, `restrictive-proxied`, `strict-open`, `strict-proxied` |
| `TABNINE_SANDBOX_IMAGE`         | Override the container image used for Docker/Podman backends                                                                                                              |
| `TABNINE_SANDBOX_PROXY_COMMAND` | Command to launch a proxy for `proxied` network profiles (must listen on `localhost:8877`)                                                                                |

***

### **Verification**

To confirm sandbox mode is active, run with debug output:

```shell
DEBUG=1 tabnine -s -p "your prompt"
```

Look for a log line such as:

```
hopping into sandbox (command: sandbox-exec) ...
```

or, for container backends:

```
hopping into sandbox (command: docker) ...
```

If this line does not appear, sandbox mode is not active.

***

### **Troubleshooting**

#### **Common Issues**

**`FatalSandboxError: TABNINE_SANDBOX is true but failed to determine command for sandbox`**

* No compatible sandbox backend was found on your system.
* On Linux: install Docker or Podman, or set `TABNINE_SANDBOX` to a specific backend name.
* On macOS: `sandbox-exec` is built in and should always be available. If this error appears on macOS, try setting `TABNINE_SANDBOX=sandbox-exec` explicitly.

**`FatalSandboxError: Invalid sandbox command '...'`**

* The value of `TABNINE_SANDBOX` is not a recognized backend name.
* Valid values: `docker`, `podman`, `sandbox-exec`, `lxc`, `runsc`, `windows-native`.

**`FatalSandboxError: Missing sandbox command '...'`**

* The specified backend binary is not installed or not on `PATH`.
* Install the required tool (e.g., `brew install docker`) or choose a different backend.

**`FatalSandboxError: gVisor (runsc) sandboxing is only supported on Linux`**

* `runsc` is Linux-only. Use `docker` or `podman` on macOS/Windows instead.

**`FatalSandboxError: Missing macos seatbelt profile file '...'`**

* The value of `SEATBELT_PROFILE` does not match any of the six built-in profiles.
* Valid values: `permissive-open`, `permissive-proxied`, `restrictive-open`, `restrictive-proxied`, `strict-open`, `strict-proxied`.

**Agent cannot write files or run commands (expected)**

* This is correct behavior. The OS sandbox restricts writes to the defined allowlist.
* If writes to a specific directory are required, pass it via `--include-directories` or add it to `allowedPaths` in `settings.json`.

**`Sandbox image '...' is missing or could not be pulled`**

* Docker/Podman cannot pull the sandbox container image.
* Check your network connection, or set `TABNINE_SANDBOX_IMAGE` to an image already present locally.

***

### **Alternatives to Sandbox Mode**

If you need safety without OS-level process isolation, the approval mode system provides interactive guardrails without requiring Docker or a container runtime.

#### **Approval Modes**

**Default mode** — prompt before every file edit and shell command:

```shell
tabnine --approval-mode default
```

**Auto-edit mode** — auto-approve file edits, prompt for shell commands:

```shell
tabnine --approval-mode auto_edit
```

**Plan mode** — agent plans and presents actions; no automatic execution:

```shell
tabnine --approval-mode plan
```

#### **Persist a Default Approval Mode**

```json
{
  "general": {
    "defaultApprovalMode": "default"
  }
}
```

#### **Disable Session Retention for Sensitive Work**

```json
{
  "general": {
    "sessionRetention": {
      "enabled": false
    }
  }
}
```

***

### **Security Best Practices**

1. **Use sandbox mode for untrusted code review** — Always enable sandbox when analyzing code from unknown sources. OS-level isolation provides a verifiable boundary that approval mode alone does not.
2. **Prefer stricter macOS profiles for sensitive environments** — Use `SEATBELT_PROFILE=strict-proxied` when you want both narrow filesystem read access and restricted network egress.
3. **Combine sandbox with `--approval-mode default`** — For modifiable sessions, pairing OS isolation with interactive confirmation gives you two independent layers of control.
4. **Limit workspace scope with `--include-directories`** — Restrict the AI's context to specific folders. These paths are also the only additional write targets allowed by the macOS sandbox profiles.
5. **Use `networkAccess: false` or a proxied profile for air-gapped review** — Set `"networkAccess": false` in `settings.json` or use a `*-proxied` Seatbelt profile to prevent the sandboxed process from making outbound connections.
6. **Never combine `--yolo` with `--sandbox` on untrusted code** — YOLO mode auto-approves all agent actions. Even inside a sandbox, this removes the interactive safeguard layer. Use `--approval-mode default` instead.
7. **Review `settings.json` regularly** — Check `~/.tabnine/agent/settings.json` for persistent sandbox settings that may carry over between sessions.

***

### **Frequently Asked Questions**

**Q: Can the AI access the internet in sandbox mode?**

A: It depends on the configuration. Container-based backends (Docker, Podman) allow network access by default unless `"networkAccess": false` is set. On macOS, the `*-open` Seatbelt profiles allow all outbound connections, while `*-proxied` profiles restrict network to a local proxy on `localhost:8877`. To enforce no network access, set `"networkAccess": false` in `settings.json` or use `SEATBELT_PROFILE=strict-proxied` with `TABNINE_SANDBOX_PROXY_COMMAND` unset.

**Q: Does sandbox mode make the AI read-only?**

A: Not exactly. Sandbox mode enforces OS-level filesystem boundaries — the process cannot write outside the defined allowlist. However, the AI agent's tools (such as `write_file` and `replace`) remain available; the OS sandbox will cause those operations to fail if they target a path outside the allowlist. If you want to prevent the agent from *attempting* file edits in the first place, combine sandbox mode with `--approval-mode default` or `--approval-mode plan`.

**Q: Will sandbox mode slow down the AI?**

A: Negligibly on macOS (Seatbelt adds no measurable overhead). Container-based backends (Docker/Podman) have a startup cost of a few seconds on first use, but subsequent operations run at normal speed.

**Q: Does sandbox mode protect against prompt injection attacks?**

A: It reduces the impact. Prompt injection attacks that attempt to exfiltrate files or modify the filesystem outside the working directory will be blocked by the OS. However, actions within the allowed write paths are still possible. Always review AI responses critically, especially when working with untrusted input.

**Q: Can I enable sandbox mode by default for all sessions?**

A: Yes. Set `"sandbox": true` in `~/.tabnine/agent/settings.json` under the `"tools"` section.

**Q: Can I customize which paths are writable inside the sandbox?**

A: Yes, via two mechanisms: pass `--include-directories /your/path` on the CLI (up to 5 paths), or set `"allowedPaths"` in the object form of `tools.sandbox` in `settings.json`.

**Q: Can I use my own container image?**

A: Yes. Set `TABNINE_SANDBOX_IMAGE` to your image name, or set the `"image"` field in the object form of `tools.sandbox` in `settings.json`. The image name must consist of alphanumeric characters, dots, colons, hyphens, underscores, and forward slashes only.


# Model Reasoning

Thinking output: Supported models can expose their internal reasoning before producing a response.

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

Supported models can expose their internal reasoning before producing a response. Enabling this gives you visibility into how the agent approached a problem, which is useful for debugging complex tasks or auditing model behavior. This is known as model reasoning *or* inline thinking.

#### **Enable inline thinking by `settings.json`**

Inline thinking is controlled by `ui.inlineThinkingMode` in your `settings.json`. The default is `"off"`.

```json
{
  "ui": {
    "inlineThinkingMode": "full"
  }
}
```

| Value    | Behavior                                               |
| -------- | ------------------------------------------------------ |
| `"off"`  | Thinking is not displayed (default)                    |
| `"full"` | The model's full reasoning is shown inline in the chat |

#### Enable Inline Thinking by `/settings`

You can also use the `/settings` command, then scroll down to Inline Thinking and toggle it on by pressing `Enter`. Press esc to `leave` the menu.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2F51LKW3En01CfdzketBhd%2Fsettings-tab-for-inline-thinking.gif?alt=media&amp;token=c94b43e0-6060-4f33-adb6-ad4908d6eb15" alt=""><figcaption></figcaption></figure>

This setting requires a restart to take effect.

#### **Show thoughts in the terminal title**

`ui.showStatusInTitle` streams the model's current reasoning to the terminal window title during the working phase. This provides ambient visibility without adding output to the chat.

```json
{
  "ui": {
    "showStatusInTitle": true
  }
}
```

#### **Scope thinking budgets to specific agents**

Use the `overrideScope` match key to apply a different budget for a specific sub-agent without changing the global default. This example gives the `codebaseInvestigator` a higher budget than general chat:

```json
{
  "modelConfigs": {
    "overrides": [
      {
        "match": {
          "overrideScope": "codebaseInvestigator"
        },
        "modelConfig": {
          "generateContentConfig": {
            "thinkingConfig": {
              "thinkingBudget": 8192
            }
          }
        }
      }
    ]
  }
}
```

The `match` object also accepts a `model` key to scope the override to a specific model name. Specificity determines precedence when multiple overrides match — a match on two keys wins over a match on one key.


# Extensions

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

Tabnine CLI includes an extensions system that lets you install external packages which define tools, contexts, or workflows for the agent. Extensions are stored locally and can be enabled, disabled, listed, updated, or removed through the CLI.

An extension typically provides:

* One or more tools, such as integrations with third-party APIs, file systems, or local utilities.
* Context definitions that tell the agent how to use these tools in specific scenarios.
* Optional commands or workflows exposed through the agent.

The overall goal is to be compatible with existing extension ecosystems that use a similar structure, while preserving Tabnine’s naming and branding.

### **Extension structure** <a href="#extension-structure" id="extension-structure"></a>

Each extension is installed into a dedicated directory under your Tabnine configuration, for example: `~/.tabnine/extensions/<extension-name>/`. Within the extension directory, you will usually find a manifest file and possibly a guide/readme file.

### **Installing and uninstalling extensions** <a href="#installing-and-uninstalling-extensions" id="installing-and-uninstalling-extensions"></a>

You manage extensions using the tabnine extensions command group. Common operations include:

* Installing a new extension from a registry, repository, or URL.
* Uninstalling an extension that you no longer need.
* Updating one or more extensions to their latest compatible versions.

```
# Install an extension from a Git repository or local path
tabnine extensions install <source> [--ref <ref>] [--auto-update] [--pre-release]
# Uninstall one or more extensions 
tabnine extensions uninstall <name...>
```

* `<source>`: Git URL or local path.
* `--ref`: Branch, tag, or commit to install.
* `--auto-update`: Enable automatic updates for this extension.
* `--pre-release`: Allow installation of pre‑release versions.

When you install an extension, the CLI clones or downloads the extension source into your local extensions directory.

It will validate the manifest and configuration (such as `tabnine-extension.json`), then convert metadata and documentation to Tabnine’s expected format where applicable. Finally, it will install or prepare any tool-specific dependencies the extension declares.

Uninstalling removes the local extension directory and unregisters its tools and commands from the agent.

### **Managing and inspecting extensions** <a href="#managing-and-inspecting-extensions" id="managing-and-inspecting-extensions"></a>

Once you have one or more extensions installed, you can conduct several tasks:

#### Enable or disable extensions without uninstalling them: <a href="#enable-or-disable-extensions-without-uninstalling-them" id="enable-or-disable-extensions-without-uninstalling-them"></a>

```
# Disable an extension (globally or per scope, if supported)
tabnine extensions disable <name> [--scope <scope>]
# Re‑enable a disabled extension
tabnine extensions enable <name> [--scope <scope>]
```

* `<name>`: Extension name.
* `--scope`: Scope such as `user` or `workspace` (if supported).

#### Listing, updating, and inspecting extensions <a href="#listing-updating-and-inspecting-extensions" id="listing-updating-and-inspecting-extensions"></a>

Where supported, the CLI can also help you explore a curated list of community extensions that are compatible with the Tabnine Agent, allowing you to discover and install them directly.

You can also display details for a specific extension, including version and description, provided tools or subagents, and known configuration options.

```
# List all installed extensions and their status
tabnine extensions list
# Show detailed information about an extension
tabnine extensions detail <name>
# Update a specific extension
tabnine extensions update <name>
# Update all installed extensions
tabnine extensions update --all
```

### **Compatibility with existing extension ecosystems** <a href="#compatibility-with-existing-extension-ecosystems" id="compatibility-with-existing-extension-ecosystems"></a>

The Tabnine extension system is designed to be compatible with extensions defined using similar formats in other CLIs. When you install such an extension:

* Its metadata file is inspected and translated into `tabnine-extension.json` if necessary.
* Documentation files (for example, a generic README or another CLI’s guide file) are converted or mirrored into `TABNINE.md` so the agent can use them as a reference.
* Tool definitions are adjusted to use Tabnine’s naming and environment conventions.

This allows many existing extensions to work as-is or with minimal adaptation.


# IDE Integration

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

Tabnine CLI integrates with **Visual Studio Code and other VS Code-based editors** through the **Tabnine CLI Companion** extension. Once connected, the CLI is aware of your open files, cursor position, and text selection, and can open a native in-editor diff view so you can review and apply AI-generated code changes without leaving the editor.

For related commands and configuration, see [Commands](/main/getting-started/tabnine-cli/features/commands), [Settings](/main/getting-started/tabnine-cli/features/settings), and [Settings Reference](/main/getting-started/tabnine-cli/features/settings/settings-reference).

{% hint style="warning" %}
**VS Code-based IDEs only.** The companion is a VS Code extension (`.vsix`) and cannot be installed into JetBrains IDEs, Eclipse, Zed, Xcode, Sublime Text, or any other non-VS Code editor. Support for JetBrains and other editors is planned through the [Agent Client Protocol (ACP)](https://agentclientprotocol.com/) registry, but is not yet available.
{% endhint %}

## Supported IDEs

Tabnine CLI provides a one-command installer (`/ide install`) for Visual Studio Code, [Positron](https://positron.posit.co/), [Firebase Studio](https://firebase.studio/), and [Antigravity](https://antigravity.google/).

The companion runs in any VS Code-compatible host (engine `^1.99.0`), so other VS Code forks such as Cursor and Windsurf are also supported. For those forks, `/ide install` will report "No installer is available" and you must install the companion manually. See [Manual installation from a `.vsix` file](#manual-installation-from-a-vsix-file) below.

{% hint style="info" %}
Running Tabnine CLI from the integrated terminal of a JetBrains IDE, Zed, Sublime Text, or Xcode is detected by the CLI, but `/ide install` returns "No installer is available" and the companion cannot be installed in those editors — the companion is a VS Code extension and has no equivalent for them today. You can still use Tabnine CLI in the terminal; you just won't get workspace context or native diffs. Integration for JetBrains and other non-VS Code editors is planned through the ACP registry.
{% endhint %}

## Features

When the companion is installed and the IDE connection is enabled, Tabnine CLI gains the following capabilities.

### Workspace context

Tabnine CLI automatically receives real-time workspace signals from the editor to make responses more relevant. Signals include the 10 most recently accessed files in your workspace, your active cursor position, and any text you have selected (up to 16 KiB; selections longer than 16 KiB are truncated).

Only local files on disk are included. Unsaved buffers and remote files are excluded.

### Native diffing

When Tabnine suggests modifications to a file, it opens the change in your IDE's native diff viewer. You can review, edit, and then accept or reject the suggested changes directly in the editor. See [Working with diffs](#working-with-diffs) below for the full list of accept and reject actions.

### VS Code commands

The companion contributes the following commands to the VS Code Command Palette (`Cmd+Shift+P` or `Ctrl+Shift+P`):

| Command                                   | What it does                                                                                      |
| ----------------------------------------- | ------------------------------------------------------------------------------------------------- |
| **Tabnine CLI: Run**                      | Opens an integrated terminal in the selected workspace folder and starts `tabnine`.               |
| **Tabnine CLI: Accept Diff**              | Accepts the changes in the active Tabnine diff editor. Visible only while a diff is open.         |
| **Tabnine CLI: Close Diff Editor**        | Rejects the changes and closes the active Tabnine diff editor. Visible only while a diff is open. |
| **Tabnine CLI: View Third-Party Notices** | Displays the third-party notices bundled with the extension.                                      |

## Installation and setup

There are three ways to install the companion extension: the first-launch prompt, `/ide install` from inside the CLI, or a manual `.vsix` install.

### Automatic prompt

The first time you launch `tabnine` inside a supported VS Code-based IDE, the CLI detects the environment and prompts you to connect. Answering **Yes** runs the equivalent of `/ide install` and enables the integration automatically. If you previously dismissed the prompt, you can always install the companion using one of the methods below.

### Install from the CLI

Run the following command inside an active Tabnine CLI session:

```bash
/ide install
```

This downloads the companion `.vsix` from your configured Tabnine host and installs it into the detected IDE using the IDE's `code` (or `positron` / `agy`) command-line tool. After a successful install, Tabnine CLI sets `ide.enabled` to `true` and connects.

{% hint style="info" %}
Tabnine CLI does not install the companion from the VS Code Marketplace or Open VSX Registry. It downloads the `.vsix` directly from your Tabnine host at `<YOUR TABNINE HOST>/update/cli-companion/vscode-cli-companion.vsix`, so your machine must be able to reach the Tabnine host at install time.
{% endhint %}

#### Prerequisites

Your IDE's command-line launcher must be on `PATH`. For VS Code this is `code` (or `code.cmd` on Windows); for Positron it is `positron`; for Antigravity it is `agy` or `antigravity`. See the [VS Code CLI setup guide](https://code.visualstudio.com/docs/configure/command-line) if `code` is not recognized.

Your Tabnine host must also be reachable from the machine running the CLI.

### Manual installation from a `.vsix` file

Use this path when you are on a **VS Code-based editor** (VS Code, Positron, Firebase Studio, Antigravity, Cursor, Windsurf, or another VS Code fork) and `/ide install` cannot find your editor's command-line launcher. The companion is a VS Code extension, so this path applies only to VS Code-compatible hosts; do not attempt to side-load the `.vsix` into JetBrains, Eclipse, or other non-VS Code IDEs.

{% stepper %}
{% step %}
**Download the `.vsix`**

Download the companion package from your Tabnine host. Replace `<YOUR TABNINE HOST>` with the Tabnine console URL configured for your team (for example, `https://console.tabnine.com`):

```
<YOUR TABNINE HOST>/update/cli-companion/vscode-cli-companion.vsix
```

{% endstep %}

{% step %}
**Install the extension**

In VS Code, open the Command Palette and run **Extensions: Install from VSIX…**, then select the downloaded file.

From the command line, run the following to install the downloaded `.vsix` directly:

```bash
code --install-extension ./vscode-cli-companion.vsix --force
```

For Positron, substitute `positron` for `code`. For Antigravity, substitute `agy`.
{% endstep %}

{% step %}
**Enable the integration**

After the extension finishes installing, open a new terminal inside your IDE and run:

```bash
/ide enable
```

This sets `ide.enabled` to `true` and establishes the connection.
{% endstep %}
{% endstepper %}

## Managing the connection

You can control the IDE connection from within the CLI at any time. Run `/ide enable` to connect, or `/ide disable` to stop using the integration. Both commands persist the `ide.enabled` value to your user settings at `~/.tabnine/agent/settings.json`, so the choice is remembered for future sessions.

To see the current connection status and the workspace context the CLI has received, run:

```bash
/ide status
```

If the integration is connected, this command reports the connected IDE and lists the recently opened files Tabnine CLI is aware of. The list is capped at 10 files and only includes local files on disk.

## Working with diffs

When Tabnine CLI proposes a file change, it opens a diff view in your editor instead of writing to disk directly. You can review, edit, and then accept or reject the proposal.

To accept a diff, save the file with `Cmd+S` or `Ctrl+S`, click the checkmark icon in the diff editor's title bar, run **Tabnine CLI: Accept Diff** from the Command Palette, or type `yes` at the CLI confirmation prompt. While a diff is open, the save shortcut accepts the change instead of writing to disk, so an ordinary save inside the diff editor commits the suggestion.

To reject a diff, click the `x` icon in the diff editor's title bar, close the diff editor tab, run **Tabnine CLI: Close Diff Editor** from the Command Palette, or type `no` at the CLI confirmation prompt.

You can also edit the suggested changes directly inside the diff view before accepting them. If you select **Allow for this session** at the CLI prompt, future changes are auto-accepted for the remainder of the session without opening the diff editor.

## Running in a sandboxed or containerized environment

The IDE integration relies on a local HTTP connection between the CLI and the companion, which means sandboxes and containers need to allow that traffic. For general sandboxing behavior in Tabnine CLI, see [Sandboxing](/main/getting-started/tabnine-cli/features/sandboxing).

On macOS, the default Seatbelt profile blocks the loopback traffic the integration needs; use a Seatbelt profile that permits network access.

In Docker or Podman, the CLI automatically falls back to `host.docker.internal` to reach the companion running on the host. No extra configuration is usually needed, but your container networking must permit container-to-host connections.

## Troubleshooting

<details>

<summary>"IDE integration is not supported in your current environment"</summary>

The full message reads:

```
IDE integration is not supported in your current environment. To use this feature, run Tabnine CLI in one of these supported IDEs: Antigravity, VS Code, or VS Code forks.
```

You are running Tabnine CLI in a terminal that is not recognized as a VS Code-based IDE. Launch the CLI from the integrated terminal of Visual Studio Code, Positron, Firebase Studio, Antigravity, or another VS Code fork.

</details>

<details>

<summary>"No installer is available for &#x3C;IDE>"</summary>

You ran `/ide install` but Tabnine CLI does not have an automated installer for the detected editor. What to do next depends on which editor you are in.

If you are on a VS Code fork without `code` on `PATH` (for example, Cursor or Windsurf), the fork is VS Code-compatible and the companion `.vsix` will work once installed. Install it manually using your fork's extension-install command; see [Manual installation from a `.vsix` file](#manual-installation-from-a-vsix-file). Then run `/ide enable`.

If you are on a JetBrains IDE, Eclipse, Zed, Sublime Text, Xcode, or any other non-VS Code editor, the companion is a VS Code extension and **cannot** be installed into these editors. Do not attempt to side-load the `.vsix`; it will not work. Either run Tabnine CLI from the integrated terminal of a VS Code-based editor to get IDE features, or use it as a standalone terminal CLI without IDE context. Support for JetBrains and other editors is planned through the ACP registry.

</details>

<details>

<summary>"Failed to connect to IDE companion extension"</summary>

The CLI could not find the environment variables the companion sets (`TABNINE_CLI_IDE_WORKSPACE_PATH` and `TABNINE_CLI_IDE_SERVER_PORT`). This usually means the extension is not running or did not finish initializing.

Confirm that **Tabnine CLI Companion** is installed and enabled in your IDE's Extensions view, open a new integrated terminal so it picks up the environment variables injected by the extension, then re-run `/ide enable`.

</details>

<details>

<summary>"IDE connection error. The connection was lost unexpectedly"</summary>

The companion was running but the connection dropped. Run `/ide enable` to reconnect. If reconnect attempts keep failing, open a new terminal or restart your IDE.

</details>

<details>

<summary>"Directory mismatch"</summary>

Tabnine CLI was started from a directory that is outside the workspace folder open in your IDE. `cd` into a directory that belongs to the open workspace and restart the CLI.

</details>

<details>

<summary>"To use this feature, please open a workspace folder"</summary>

No workspace is open in the IDE. Open a folder in your IDE and restart the CLI.

</details>

<details>

<summary>Manually associating the CLI with an IDE instance</summary>

If automatic IDE detection fails, or if you launch Tabnine CLI from a standalone terminal and want to attach it to a specific IDE window, set `TABNINE_CLI_IDE_PID` to the process ID of that IDE instance before starting the CLI.

On macOS and Linux, export the variable and then start Tabnine:

```bash
export TABNINE_CLI_IDE_PID=12345
tabnine
```

On Windows PowerShell, use the `$env:` syntax:

```powershell
$env:TABNINE_CLI_IDE_PID = 12345
tabnine
```

When this variable is set, Tabnine CLI skips automatic PID discovery and uses the provided process ID.

</details>


# YOLO Mode

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

YOLO mode is Tabnine CLI’s “approve everything” mode for tool calls.

When enabled, Tabnine CLI sets the approval mode to `yolo`, adds a policy rule that allows `*` tools, and automatically approves tool calls that would normally ask for confirmation first. This can include potentially destructive actions such as shell commands, file edits, and tool redirections, unless another security or admin policy blocks them.

### Enable YOLO from Tabnine CLI

Use the legacy YOLO flag:

```bash
tabnine --yolo
```

You can also use the short flag:

```bash
tabnine -y
```

Alternatively, set the approval mode explicitly:

```bash
tabnine --approval-mode=yolo
```

### **Restrict YOLO Mode (v6.4.0)**

YOLO mode lets users run the Tabnine CLI with automatic approval of all tool calls without manual confirmation. While useful for trusted automation scenarios, unrestricted YOLO access can pose a security risk when users or CI scripts execute arbitrary tools against organizational resources.

The **Restrict YOLO mode** toggle on the Agent Features admin page allows admins to block all YOLO entry points org-wide for regular users:

| Entry point                     | Blocked when restricted |
| ------------------------------- | ----------------------- |
| `--yolo` / `-y` flag            | ✅                       |
| `--approval-mode=yolo`          | ✅                       |
| In-session approval-mode picker | ✅                       |
| Headless mode (`-p`)            | ✅                       |

To enable it, go to the Admin Console and navigate to **Agent Features**.

Under **Security**, locate **Restrict YOLO (auto-approve) mode in the CLI**. Toggle the setting **ON**.

The restriction is **off by default**; in other words, YOLO mode is permitted unless an admin explicitly restricts it via this toggle.

**Note:** The setting takes effect on the user's **next CLI session**. Users with an active session must restart the CLI for the restriction to apply.


# Troubleshooting

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

Solutions to common problems and questions about Tabnine CLI.

### Quick Troubleshooting

#### Slow Performance?

* Check network connection.
* Be more specific in prompts.
* Try a different model: `/model`.
* See [Common Issues - Performance](/main/getting-started/tabnine-cli/troubleshooting/common-issues#performance-issues).

#### Can't Access Files?

* Check file permissions.
* Verify working directory.
* Use absolute paths.
* See [Common Issues - File Access](/main/getting-started/tabnine-cli/troubleshooting/common-issues#file-access-issues).

#### Can't interact with the agent?

* Ensure you have network connection to your Tabnine host
* Tabnine CLI requires **Tabnine Agents** to be enabled for your team.
  * If sign-in works but agent workflows/tools don’t, ask your admin to enable Agents.
* Restart Tabnine CLI after Agents are enabled.
* See the [FAQ](/main/getting-started/tabnine-cli/troubleshooting/faq) for details.

#### Other Issues?

* Try clearing: `/clear` or `Ctrl+L`.
* Check the [FAQ](/main/getting-started/tabnine-cli/troubleshooting/faq) for answers.
* See [Common Issues](/main/getting-started/tabnine-cli/troubleshooting/common-issues) for solutions.

### Specific Issues

Here are some solutions to frequently encountered problems.

#### Performance Issues

**Slow Responses**

**Causes**:

* Slow network
* Large file context
* Complex prompts

**Solutions**:

1. **Check network:** Run the following to check for network issues:
   1. ```bash
      ping api.tabnine.com
      ```
2. **Be more specific in prompts** – Make prompts concise and targeted to reduce processing.
3. **Reduce file references** – Limit the amount of file content referenced in a single request.
4. **Try a different model** – Use the `/model` command to switch models.

**High Memory Usage**

**Normal**: 50-200 MB

If the memory usage is excessive, try the following:

1. **Clear the conversation:**
   1. ```bash
      /clear
      ```
2. **Restart Tabnine-CLI:** Restart the Tabnine CLI process to free memory.
3. **Reduce context size:** Limit context or file sizes referenced in prompts.

#### Connection Issues

**Cannot Connect to API**

**Symptoms**: "Failed to connect"

**Solutions**:

1. Check internet – Run:

```bash
ping api.tabnine.com
```

2. Check firewall – Ensure port 443 is allowed.
3. Check proxy settings – Verify proxy environment variables or client proxy configuration.
4. Try debug mode – Run:

```bash
DEBUG=1 tabnine
```

**Proxy Issues**

**Solution**: Set proxy variables:

```bash
export NODE_USE_ENV_PROXY=1
export HTTP_PROXY=http://proxy:8080
export HTTPS_PROXY=http://proxy:8080
tabnine
```

#### File Access Issues

**Cannot Read Files**

**Symptoms**: "Permission denied" or file not found

**Solutions**:

1. Check file permissions – Ensure the process has read permissions for the file.
2. Verify file path – Confirm the path is correct.
3. Check working directory – Ensure you're running commands from the intended working directory.
4. Use absolute paths – Try using absolute file paths to avoid path resolution issues.

**Cannot Write Files**

**Symptoms**: Cannot create or modify files

**Solutions**:

* Check directory permissions – Ensure write permissions are available for the target directory.
* Verify disk space – Confirm there is sufficient disk space.
* Check file locks – Make sure the file is not locked by another process.

#### Feature Issues

**Remote Code Search Not Working**

**Solutions**:

{% stepper %}
{% step %}
**Check enabled**

Open settings: `/settings` → Tools → Remote Code Search
{% endstep %}

{% step %}
**Verify account access**

Ensure your account has the necessary access.
{% endstep %}

{% step %}
**Check indexing**

Confirm the codebase is indexed in Tabnine account settings.
{% endstep %}
{% endstepper %}

**Coaching Not Working**

**Solutions**:

{% stepper %}
{% step %}
**Check enabled**

Open settings: `/settings` → Tools → Coaching Guidelines
{% endstep %}

{% step %}
**Verify account access**

Ensure your account has the necessary access.
{% endstep %}

{% step %}
**Be specific in prompts**

Try more specific prompts when requesting coaching.
{% endstep %}
{% endstepper %}

**Agent Features Not Working**

If sign-in works but Tabnine CLI can’t communicate with the agent (or agent tools are missing), your team may not have Agents enabled.

Ask your Tabnine admin to enable **Tabnine Agents** for your team in the Admin Console, then restart Tabnine CLI.

#### Other Issues

**Command Not Found**

**Symptoms**: `tabnine: command not found`

**Solutions**:

* Verify installation – Confirm Tabnine CLI is installed (see [**Installation Guide**](/main/getting-started/tabnine-cli/getting-started/installation)).
* Check PATH – Ensure your PATH includes the installation directory.
* Run with full PATH – Example:

```bash
~/.local/bin/tabnine
```

**Unexpected Behavior**

**Solution**: Enable debug mode:

```bash
DEBUG=1 tabnine
```

This shows detailed logs to help identify the issue.

### Still Having Issues?

Use `/bug` in Tabnine CLI to report the issue.


# Common Issues

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

Solutions to frequently encountered problems.

### Performance Issues

#### Slow Responses

**Causes**:

* Slow network
* Large file context
* Complex prompts

**Solutions**:

{% stepper %}
{% step %}
**Check network**

Run:

```bash
ping api.tabnine.com
```

{% endstep %}

{% step %}
**Be more specific in prompts**

Make prompts concise and targeted to reduce processing.
{% endstep %}

{% step %}
**Reduce file references**

Limit the amount of file content referenced in a single request.
{% endstep %}

{% step %}
**Try a different model**

Use the `/model` command to switch models.
{% endstep %}
{% endstepper %}

#### High Memory Usage

**Normal**: 50-200 MB

**If excessive**:

{% stepper %}
{% step %}
**Clear conversation**

Run:

```
/clear
```

{% endstep %}

{% step %}
**Restart Tabnine CLI**

Restart the Tabnine CLI process to free memory.
{% endstep %}

{% step %}
**Reduce context size**

Limit context or file sizes referenced in prompts.
{% endstep %}
{% endstepper %}

### Connection Issues

#### Cannot Connect to API

**Symptoms**: "Failed to connect"

**Solutions**:

{% stepper %}
{% step %}
**Check internet**

Run:

```bash
ping api.tabnine.com
```

{% endstep %}

{% step %}
**Check firewall**

Ensure port 443 is allowed.
{% endstep %}

{% step %}
**Check proxy settings**

Verify proxy environment variables or client proxy configuration.
{% endstep %}

{% step %}
**Try debug mode**

Run:

```bash
DEBUG=1 tabnine
```

{% endstep %}
{% endstepper %}

#### Proxy Issues

**Solution**: Set proxy variables:

```bash
export NODE_USE_ENV_PROXY=1
export HTTP_PROXY=http://proxy:8080
export HTTPS_PROXY=http://proxy:8080
tabnine
```

### File Access Issues

#### Cannot Read Files

**Symptoms**: "Permission denied" or file not found

**Solutions**:

{% stepper %}
{% step %}
**Check file permissions**

Ensure the process has read permissions for the file.
{% endstep %}

{% step %}
**Verify file path**

Confirm the path is correct.
{% endstep %}

{% step %}
**Check working directory**

Ensure you're running commands from the intended working directory.
{% endstep %}

{% step %}
**Use absolute paths**

Try using absolute file paths to avoid path resolution issues.
{% endstep %}
{% endstepper %}

#### Cannot Write Files

**Symptoms**: Cannot create or modify files

**Solutions**:

{% stepper %}
{% step %}
**Check directory permissions**

Ensure write permissions are available for the target directory.
{% endstep %}

{% step %}
**Verify disk space**

Confirm there is sufficient disk space.
{% endstep %}

{% step %}
**Check file locks**

Make sure the file is not locked by another process.
{% endstep %}
{% endstepper %}

### Feature Issues

#### Remote Code Search Not Working

**Solutions**:

{% stepper %}
{% step %}
**Check enabled**

Open settings: `/settings` → Tools → Remote Code Search
{% endstep %}

{% step %}
**Verify account access**

Ensure your account has the necessary access.
{% endstep %}

{% step %}
**Check indexing**

Confirm the codebase is indexed in Tabnine account settings.
{% endstep %}
{% endstepper %}

#### Coaching Not Working

**Solutions**:

{% stepper %}
{% step %}
**Check enabled**

Open settings: `/settings` → Tools → Coaching Guidelines
{% endstep %}

{% step %}
**Verify account access**

Ensure your account has the necessary access.
{% endstep %}

{% step %}
**Be specific in prompts**

Try more specific prompts when requesting coaching.
{% endstep %}
{% endstepper %}

### Other Issues

#### Command Not Found

**Symptoms**: `tabnine: command not found`

**Solutions**:

{% stepper %}
{% step %}
**Verify installation**

Confirm Tabnine CLI is installed (see [**Installation Guide**](/main/getting-started/tabnine-cli/getting-started/installation)).
{% endstep %}

{% step %}
**Check PATH**

Ensure your PATH includes the installation directory.
{% endstep %}

{% step %}
**Run with full path**

Example:

```bash
~/.local/bin/tabnine
```

(Linux/macOS)
{% endstep %}
{% endstepper %}

#### Unexpected Behavior

**Solution**: Enable debug mode:

```bash
DEBUG=1 tabnine
```

This shows detailed logs to help identify the issue.

### Getting More Help

* [**FAQ**](/main/getting-started/tabnine-cli/troubleshooting/faq) - Frequently asked questions
* **Debug Mode**: `DEBUG=1 tabnine`
* **Report Issue**: Use `/bug` command in Tabnine CLI

<details>

<summary>Still having issues? (FAQ &#x26; reporting)</summary>

* See the FAQ: [**FAQ**](/main/getting-started/tabnine-cli/troubleshooting/faq)
* Enable debug logs:

```bash
DEBUG=1 tabnine
```

* Report an issue using the `/bug` command in Tabnine CLI.

</details>


# FAQ

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

Common questions and answers about using Tabnine CLI.

### General

<details>

<summary>What is Tabnine CLI?</summary>

Tabnine CLI is an AI-powered coding assistant that runs in your terminal. It helps you write, understand, and improve code using advanced AI models.

</details>

<details>

<summary>What can Tabnine CLI do?</summary>

* Answer questions about your code
* Review and improve code quality
* Generate new code
* Search large codebases (Remote Code Search)
* Provide best practices (Coaching Guidelines)
* Read, write, and analyze files
* Execute shell commands safely

</details>

<details>

<summary>Do I need an internet connection?</summary>

**You need access to your Tabnine services endpoint (cloud or self‑hosted)**. Public internet isn’t required if your organization runs Tabnine in an air‑gapped environment.

</details>

### Getting Started

<details>

<summary>How do I start Tabnine CLI?</summary>

Simply run:

```bash
tabnine
```

This starts interactive mode.

</details>

### Using Tabnine CLI

<details>

<summary>How do I reference files in prompts?</summary>

Use the `@` symbol:

```
> Explain what @src/index.ts does
> Review @src/utils/validator.ts
```

</details>

<details>

<summary>What commands are available?</summary>

Type `/help` to see all commands. Key ones:

* `/help` - Show help
* `/model` - Change AI model
* `/settings` - Configure
* `/clear` - Clear conversation
* `/exit` - Exit

</details>

<details>

<summary>How do I change the AI model?</summary>

```
> /model
```

Select from the available models.

</details>

<details>

<summary>Can Tabnine CLI modify my files?</summary>

Yes, but only with your explicit confirmation. It will:

* Review proposed changes: Tabnine CLI shows the proposed changes to the file(s).
* Ask for confirmation: You must explicitly approve the changes.
* Apply changes: Changes are applied only if you approve them.

</details>

<details>

<summary>How do I use Tabnine CLI in scripts?</summary>

Non-interactive mode:

```bash
# Simple output
tabnine -p "Your prompt here"

# JSON output
tabnine -p "Your prompt" --output-format json

# Pipe input
cat file.js | tabnine -p "Review this code"
```

</details>

<details>

<summary>How do I exit Tabnine CLI?</summary>

Press `Ctrl+C` or type:

```
> /exit
```

</details>

<details>

<summary>How do I paste images into Tabnine CLI?</summary>

Copy an image to your clipboard, then use the appropriate shortcut for your OS.

### Keyboard shortcuts by OS

| OS                    | Shortcut            |
| --------------------- | ------------------- |
| macOS                 | `Cmd+V`             |
| Windows               | `Alt+V`             |
| Linux (Wayland / X11) | `Ctrl+V` or `Alt+V` |

`Ctrl+V` works universally across all platforms.

### Paste placeholders

Large pasted content appears as a collapsed placeholder: `[Pasted Text: X lines]`.

* Press `Ctrl+O` while the cursor is on the placeholder to expand or collapse it.
* In alternate buffer mode, double-click the placeholder to expand or collapse it.

```
> /exit
```

</details>

### Features

<details>

<summary>What is Remote Code Search?</summary>

Remote Code Search lets you search across large codebases using Tabnine's cloud indexing. It's fast, semantic, and works across millions of lines of code.

[**→ Learn more**](/main/administering-tabnine/managing-your-team/context-engine)

</details>

<details>

<summary>What are Coaching Guidelines?</summary>

AI-powered coding best practices tailored to your codebase. Get security recommendations, architecture patterns, and code quality guidance.

[**→ Learn more**](/main/administering-tabnine/managing-your-team/context-engine/coaching-guidelines-v)

</details>

<details>

<summary>What tools are built-in?</summary>

* File operations (read, write, search)
* Shell commands
* Remote Code Search
* Coaching Guidelines
* Code analysis

[**→ See all tools**](/main/getting-started/tabnine-cli/features/built-in-tools)

</details>

### Enterprise/Corporate

<details>

<summary>Does Tabnine CLI work behind a proxy?</summary>

Yes. For Node.js 24+:

```bash
export NODE_USE_ENV_PROXY=1
export HTTP_PROXY=http://proxy.company.com:8080
export HTTPS_PROXY=http://proxy.company.com:8080
tabnine
```

</details>

<details>

<summary>How do I use custom CA certificates?</summary>

```bash
export NODE_USE_SYSTEM_CA=1

# Or
export NODE_EXTRA_CA_CERTS=/path/to/ca-bundle.crt
tabnine
```

</details>

### Troubleshooting

<details>

<summary>Why doesn’t Tabnine CLI work with the agent?</summary>

Tabnine CLI requires **Tabnine Agents** to be enabled for your team.

If Agents aren’t enabled for your team, agent workflows and tools won’t work (even if sign-in works).

Ask your Tabnine admin to enable Agents for your team in the Admin Console, then restart Tabnine CLI.

</details>

<details>

<summary>Why is Tabnine CLI slow?</summary>

Common causes:

* Slow network connection
* Large file context
* Complex prompts

Solutions:

* Check network speed
* Be more specific in prompts
* Reduce file references
* Try a different model with `/model`

</details>

<details>

<summary>"Command not found: tabnine"</summary>

Verify Tabnine CLI is installed and in your PATH. See the [**Installation Guide**](/main/getting-started/tabnine-cli/getting-started/installation) for setup instructions.

</details>

<details>

<summary>How do I enable debug mode?</summary>

```bash
DEBUG=1 tabnine
```

Or in interactive mode:

```
> /debug on
```

</details>

<details>

<summary>Why can't Tabnine CLI access my files?</summary>

* Check file permissions.
* Ensure the user running Tabnine has permission to read the files.
* Verify working directory.
* Confirm you're in the correct working directory.
* Use absolute or correct relative paths.
* Try absolute paths or adjust relative paths to point to the correct files.

</details>

### Performance

<details>

<summary>How can I make Tabnine CLI faster?</summary>

* Be specific in prompts
* Narrow prompts to reduce processing.
* Limit file context
* Reduce the number or size of referenced files.
* Choose faster models
* Select models optimized for latency via /model.
* Use local search for recent changes
* Prefer local search when working with very recent edits.
* Check network connection
* Ensure stable and fast network access.

</details>

<details>

<summary>Does Tabnine CLI cache responses?</summary>

Yes, recent queries and context are cached automatically.

</details>

<details>

<summary>How much memory does it use?</summary>

Typically 50-200 MB depending on:

* Conversation history
* Files referenced
* Model complexity

</details>

### Privacy & Security

<details>

<summary>What data does Tabnine CLI send?</summary>

Sent:

* Your prompts
* Referenced file content

Not Sent:

* Entire codebase
* Unreferenced files
* Secrets/credentials

</details>

<details>

<summary>Is my code stored on Tabnine servers?</summary>

Code in prompts may be processed and logged for service improvement. See Tabnine's privacy policy for details.

</details>

<details>

<summary>How secure is authentication?</summary>

Tabnine CLI uses secure authentication with HTTPS encryption.

</details>

### Advanced

<details>

<summary>Can I customize AI behavior?</summary>

Yes, use `TABNINE.md` in your project root:

```markdown
# Project Context

This is a TypeScript Node.js project.

## Conventions
- Use async/await
- Add JSDoc to exports
- Write tests in __tests__/
```

</details>

<details>

<summary>Can I use multiple Tabnine accounts?</summary>

Yes, by manually swapping credential files if needed.

</details>

<details>

<summary>Can I run multiple instances?</summary>

Yes, each terminal session can run its own instance.

</details>

<details>

<summary>Can I use Tabnine CLI with other tools?</summary>

Yes:

```bash
# Pipe input
cat file.js | tabnine -p "Review this"

# In scripts
result=$(tabnine -p "..." --output-format json)

# With git
git diff | tabnine -p "Summarize changes"
```

</details>

### Common Errors

<details>

<summary>"Failed to connect to Tabnine API"</summary>

1. Check internet: `ping api.tabnine.com`
2. Check proxy settings
3. Verify firewall allows port 443
4. Try debug mode: `DEBUG=1 tabnine`

</details>

<details>

<summary>"Remote Code Search not supported"</summary>

* Your account may not have access
* Contact Tabnine support

</details>

### Getting More Help

<details>

<summary>Where can I get more help?</summary>

* In-App Help: Type `/help` in Tabnine CLI
* Troubleshooting: See Common Issues
* Report Issues: Use `/bug` command

</details>

***

Didn't find your answer? Use the `/bug` command in Tabnine CLI to report issues or ask questions.


# Examples

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

Real-world examples and workflows using Tabnine CLI.

### What You'll Learn

These examples demonstrate practical Tabnine CLI usage patterns:

* **Combining multiple tools** - Use Remote Code Search, Coaching Guidelines, and file operations together
* **Iterative workflows** - Build on previous responses to dive deeper
* **Context management** - Provide the right context for better results
* **Output formatting** - Generate reports in different formats

### Try It Yourself

All examples use real commands you can run immediately:

```bash
# Start Tabnine CLI
tabnine

# Follow along with the examples
```

### More Resources

**Getting Started**: [Quick Start Guide](/main/getting-started/tabnine-cli/getting-started/quickstart)\
**Features**: [Commands](/main/getting-started/tabnine-cli/features/commands) | [Keyboard Shortcuts](/main/getting-started/tabnine-cli/features/keyboard-shortcuts)\
**Tools**: [Remote Code Search](/main/administering-tabnine/managing-your-team/context-engine) | [Coaching Guidelines](/main/administering-tabnine/managing-your-team/context-engine/coaching-guidelines-v)


# Code Review

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

Learn how to use Tabnine CLI for effective code review.

### Basic Code Review

#### Review a Single File

```bash
tabnine
```

Then:

```
> Review @src/auth/login.ts and suggest improvements
```

{% stepper %}
{% step %}
**What Tabnine CLI does**

* Reads the file
* Analyzes code structure
* Checks for issues
* Suggests improvements
* Provides specific recommendations
  {% endstep %}

{% step %}
**Example Output**

```
AI: I've reviewed @src/auth/login.ts. Here are my findings:

✓ Good Practices:
- Proper async/await usage
- Input validation present

⚠️  Suggestions:

1. Security: Line 45
   Add password strength validation
   
2. Error Handling: Line 67
   Use custom error types
   
3. Code Quality: Line 89
   Extract magic number to constant

Would you like me to make these changes?
```

{% endstep %}
{% endstepper %}

#### Review Multiple Files

```
> Review all TypeScript files in @src/auth/ and check for:
> - Security vulnerabilities
> - Error handling
> - Missing documentation
```

#### Review Recent Changes

```
> Review the changes I made to @src/api/users.ts
```

### Using Remote Code Search

Find related code for better context:

```
> Using Remote Code Search, find similar authentication code and review @src/auth.ts for consistency
```

### Using Coaching Guidelines

Get best practices applied:

```
> Review @src/api/users.ts according to security best practices and coding guidelines
```

### Security Audit

```
> Perform security audit on @src/:
> - SQL injection
> - XSS vulnerabilities
> - Authentication issues
> - Hardcoded secrets
```

**Example Output**:

```
AI: 🔒 Security Audit Results:

⚠️  HIGH: SQL Injection (Line 78)
query = `SELECT * FROM users WHERE id = ${userId}`;

Risk: Direct user input in SQL
Fix: Use parameterized queries:
const query = 'SELECT * FROM users WHERE id = ?';
const results = await db.query(query, [userId]);

⚠️  MEDIUM: Missing Input Validation (Line 45)
Fix: Add validation before processing
```

### Performance Review

```
> Analyze @src/api/users.ts for performance issues:
> - N+1 queries
> - Inefficient loops
> - Missing caching
```

### Automation Examples

#### Pre-Commit Review

Create `review.sh`:

```bash
#!/bin/bash

# Get staged files
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep '\.ts$\|\.js$')

if [ -z "$STAGED_FILES" ]; then
  exit 0
fi

# Review
echo "Reviewing staged files..."
tabnine -p "Review these files for issues: $STAGED_FILES" --output-format json > review.json

# Check results
if grep -q "critical\|security" review.json; then
  echo "⚠️  Issues found. Review before committing."
  exit 1
fi

echo "✓ Review complete"
```

#### CI/CD Integration

**GitHub Actions**:

```yaml
- name: Code Review
  env:
    TABNINE_REFRESH_TOKEN: ${{ secrets.TABNINE_TOKEN }}
  run: |
    DIFF=$(git diff main...HEAD)
    tabnine -p "Review this PR: $DIFF" --output-format json > review.json
```

### Best Practices

{% stepper %}
{% step %}
**Be Specific**

❌ "Review my code"\
✅ "Review @src/auth.ts for security vulnerabilities and error handling"
{% endstep %}

{% step %}
**Provide Context**

```
> Review @src/payment/processor.ts

Context:
- Handles credit card payments
- Must be PCI compliant
- Processes ~1000 transactions/hour

Focus on security and reliability.
```

{% endstep %}

{% step %}
**Use Multiple Tools**

```
> Using Remote Code Search and Coaching Guidelines, review @src/api/ for best practices
```

{% endstep %}

{% step %}
**Ask Follow-ups**

```
> Review @src/auth.ts
> Can you explain the security issue in more detail?
> How would I fix it?
> Show me an example
```

{% endstep %}
{% endstepper %}

### Common Review Patterns

#### Before Merging

```
> Pre-merge checklist for @src/features/new-feature/:
> - All functions have tests
> - No debug code
> - Error handling complete
> - Documentation updated
> - Follows project conventions
```

#### After Refactoring

```
> Post-refactoring review of @src/services/user.ts:
> - Functionality preserved
> - No new bugs
> - More maintainable
> - Performance not degraded
```

#### For New Code

```
> Review @src/api/products.ts:
> - Code quality
> - Best practices
> - Security
> - Performance
> - Test coverage
```

### Next Steps

* [**Remote Code Search**](/main/administering-tabnine/managing-your-team/context-engine) - Search large codebases
* [**Coaching Guidelines**](/main/administering-tabnine/managing-your-team/context-engine/coaching-guidelines-v) - Get best practices
* [**Quick Start**](/main/getting-started/tabnine-cli/getting-started/quickstart) - Learn more

### Getting Help

* [**FAQ**](/main/getting-started/tabnine-cli/troubleshooting/faq) - Common questions
* [**Troubleshooting**](/main/getting-started/tabnine-cli/troubleshooting/common-issues) - Solve problems
* **In-App**: Type `/help` or `/bug`


# Git Integrations

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

{% hint style="warning" %}
Tabnine use is limited to one user per seat under the license agreement. If you want to use Tabnine in a CI/CD pipeline, please contact our team.
{% endhint %}

Run Tabnine CLI in your CI/CD pipeline to automate tasks on every pull request — code review, documentation generation, test scaffolding, and more.

### Overview

Tabnine CLI can run in [non-interactive (headless) mode](/main/getting-started/tabnine-cli/getting-started/quickstart#non-interactive-mode) inside CI/CD pipelines, triggered automatically on pull requests and merge requests. The provided integrations install the CLI, authenticate, and execute a prompt against your codebase — the agent has full access to the diff, the repository, and the platform's API to post comments and results.

The behavior is entirely driven by the **prompt** you provide. The out-of-the-box configurations include a comprehensive code review prompt, but you can customize or replace it to automate any task.

### Prerequisites

Before setting up any integration, ensure you have:

* **Tabnine account** with Agents enabled for your team
* **`TABNINE_KEY`** — Tabnine [Personal Access Token](/main/administering-tabnine/managing-your-team/settings/access-tokens). Obtain this from your Tabnine admin console.
* **Node.js 20** — Available in the CI runner (GotLab/Bibucket provided configurations use the `node:20` image)

{% hint style="info" %}
The `TABNINE_KEY` is a Personal Access Token used for non-interactive (headless) authentication. Store it as a secret/secured variable in your CI/CD platform - never commit it to your repository.
{% endhint %}

### Supported Platforms

| Platform                                                                                      | Integration Type | Trigger                        |
| --------------------------------------------------------------------------------------------- | ---------------- | ------------------------------ |
| [GitHub Actions](/main/getting-started/tabnine-cli/git-integrations/github-actions)           | Composite Action | `pull_request` event           |
| [GitLab CI/CD](/main/getting-started/tabnine-cli/git-integrations/gitlab-ci)                  | CI Job           | `merge_request_event` pipeline |
| [Bitbucket Pipelines](/main/getting-started/tabnine-cli/git-integrations/bitbucket-pipelines) | Pipeline Step    | Pull request pipelines         |

### How It Works

```
┌─────────────────────┐
│  Developer opens    │
│  a Pull Request     │
└────────┬────────────┘
         ↓
┌─────────────────────┐
│  CI/CD pipeline     │
│  triggers           │
└────────┬────────────┘
         ↓
┌─────────────────────┐
│  Tabnine CLI installs│
│  and authenticates  │
└────────┬────────────┘
         ↓
┌─────────────────────┐
│  Agent executes     │
│  your prompt        │
└────────┬────────────┘
         ↓
┌─────────────────────┐
│  Results posted     │
│  on the PR/MR       │
└─────────────────────┘
```

The agent runs with access to:

* **The full repository** — it can read any file, not just the diff
* **Shell commands** — it can run build tools, test runners, linters, etc.
* **The platform API** — it can post comments, fetch PR metadata, and interact with the hosting platform
* **Tabnine's context engine** — it can search across your organization's repositories, fetch service summaries, and validate against coaching guidelines

### Example Use Cases

| Use Case                 | What the Agent Does                                                                                            |
| ------------------------ | -------------------------------------------------------------------------------------------------------------- |
| **Code Review**          | Audits the PR diff for bugs, security issues, performance, and posts inline comments (included out-of-the-box) |
| **Documentation**        | Generates or validates documentation for changed code and posts it as a PR comment                             |
| **Test Generation**      | Scaffolds unit tests for new or modified functions                                                             |
| **Coverage Analysis**    | Identifies untested code paths in the diff and suggests what to cover                                          |
| **Changelog Drafting**   | Summarizes PR changes into a changelog entry                                                                   |
| **Migration Validation** | Checks database migrations for safety and backward compatibility                                               |
| **Custom Policies**      | Enforces team-specific conventions, naming rules, or architectural constraints                                 |

Each of these is achieved by changing the prompt passed to `tabnine -y -p "..."` in your pipeline configuration.

### Customizing the Prompt

The core of every integration is a single call to the Tabnine CLI in non-interactive mode:

```bash
~/.local/bin/tabnine -y -p "YOUR PROMPT HERE"
```

The prompt defines what the agent does. The provided configurations include a detailed code review prompt, but you can replace it with any instructions. Your prompt can reference:

* **Environment variables** — CI/CD variables like PR number, commit SHAs, branch names
* **Platform APIs** — Instructions for the agent to call the GitHub/GitLab/Bitbucket API
* **Shell commands** — The agent can execute commands you describe in the prompt
* **Tabnine tools** — Remote code search, coaching guidelines, and other built-in capabilities

{% hint style="info" %}
The `-y` flag enables auto-accept mode, so the agent executes tool calls without waiting for confirmation — essential for non-interactive CI/CD environments.
{% endhint %}

### The Included Code Review Prompt

The out-of-the-box configurations include a comprehensive code review prompt that:

{% stepper %}
{% step %}
**Fetches the PR/MR diff**

Uses the platform's API to obtain the diff for the pull/merge request.
{% endstep %}

{% step %}
**Classifies the change**

Assigns a risk tier (Low, Standard, High) to the change.
{% endstep %}

{% step %}
**Audits the code**

Checks for correctness, security, performance, and other issues.
{% endstep %}

{% step %}
**Analyzes cross-repo impact**

Uses Tabnine's context engine to assess effects across repositories.
{% endstep %}

{% step %}
**Validates against coaching guidelines**

Applies team-configured coaching guidelines to the change.
{% endstep %}

{% step %}
**Posts inline comments**

Adds actionable suggestions on specific lines in the diff.
{% endstep %}

{% step %}
**Posts a summary comment**

Provides an overall assessment in a summary comment on the PR/MR.
{% endstep %}
{% endstepper %}

The review evaluates code against these categories, in priority order:

| Priority | Category            | Examples                                           |
| -------- | ------------------- | -------------------------------------------------- |
| **P0**   | Correctness & Logic | Null dereferences, off-by-one errors, async issues |
| **P0**   | Data Integrity      | Missing transactions, idempotency problems         |
| **P1**   | Security            | SQL injection, hardcoded secrets, auth gaps        |
| **P1**   | API Contract Safety | Breaking changes, backward compatibility           |
| **P1**   | Error Handling      | Silent failures, missing cleanup                   |
| **P1**   | Performance         | N+1 queries, blocking I/O, resource leaks          |
| **P2**   | Deployment Safety   | Migration risks, missing feature flags             |
| **P2**   | Observability       | Missing logging, exposed sensitive data            |
| **P2**   | Maintainability     | Naming, conventions, documentation                 |

### Optional Configuration

All integrations support these optional settings:

| Setting          | Description                                                       | Default                           |
| ---------------- | ----------------------------------------------------------------- | --------------------------------- |
| **Tabnine Host** | URL of your Tabnine console (for self-hosted / EMT installations) | `https://console.tabnine.com`     |
| **Model ID**     | Override the AI model used by the agent                           | System default from admin console |

### Next Steps

Set up Tabnine CLI in your CI/CD pipeline:

* [**GitHub Actions**](/main/getting-started/tabnine-cli/git-integrations/github-actions) — Step-by-step setup for GitHub
* [**GitLab CI/CD**](/main/getting-started/tabnine-cli/git-integrations/gitlab-ci) — Step-by-step setup for GitLab
* [**Bitbucket Pipelines**](/main/getting-started/tabnine-cli/git-integrations/bitbucket-pipelines) — Step-by-step setup for Bitbucket

### See Also

* [Code Review (Interactive)](/main/getting-started/tabnine-cli/examples/code-review) — Using Tabnine CLI for manual code reviews
* [Model Selection](/main/getting-started/tabnine-cli/features/model-selection) — Choosing the right model


# GitHub Actions

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

{% hint style="warning" %}
Tabnine use is limited to one user per seat under the license agreement. If you want to use Tabnine in a CI/CD pipeline, please contact our team.
{% endhint %}

Run Tabnine CLI on every GitHub pull request to automate code review, documentation, test generation, and more.

### Overview

The Tabnine GitHub Action is a [composite action](https://docs.github.com/en/actions/sharing-automations/creating-actions/creating-a-composite-action) that installs the Tabnine CLI, authenticates, and runs the agent in non-interactive mode on every pull request. The included configuration provides a comprehensive code review prompt, but you can customize the prompt to automate any task — documentation generation, test scaffolding, changelog drafting, and more.

#### Composite Action vs. Standalone Workflow

There are two ways to use Tabnine with GitHub Actions:

| Approach                           | Best For                                                                                                                |
| ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| **Composite Action** (recommended) | Most users - minimal setup, automatic updates when you bump the action version                                          |
| **Standalone Workflow**            | Users who want full control over every step, need to customize the setup, or prefer not to depend on an external action |

The **Quick Setup** below uses the composite action. If you prefer the standalone approach, copy `GitHub/tabnine-review.yml` from [this repository](https://github.com/codota/tabnine-pr-agent/tree/main/GitHub) into your project at `.github/workflows/tabnine-review.yml`. The standalone workflow contains all the same steps (CLI installation, authentication, cleanup, and the code review prompt) inlined directly, so you can modify any part of it.

{% hint style="info" %}
The standalone workflow uses GitHub **repository variables** (`vars.TABNINE_HOST`, `vars.TABNINE_MODEL_ID`) for optional configuration instead of action inputs. Set them in **Settings > Secrets and variables > Actions > Variables tab > New repository variable**.
{% endhint %}

{% hint style="info" %}
When setting an env variable `TABNINE_CLEANUP=True`, a cleanup stage will be added to the workflow and delete the settings that were generated previously.
{% endhint %}

### Prerequisites

* A GitHub repository with Actions enabled
* A Tabnine account with Agents enabled
* `TABNINE_KEY` - Tabnine [Personal access token](/main/administering-tabnine/managing-your-team/settings/access-tokens)

### Quick Setup

{% stepper %}
{% step %}
**Add the `TABNINE_KEY` secret**

Go to your repository's **Settings > Secrets and variables > Actions** and add a new repository secret named `TABNINE_KEY` with your Tabnine PAT.
{% endstep %}

{% step %}
**Create the workflow file**

Create `.github/workflows/tabnine-review.yml` in your repository:

{% code title=".github/workflows/tabnine-review\.yml" %}

```yaml
name: "Tabnine PR Review Agent"

on:
  pull_request:
    branches:
      - main

permissions:
  contents: read
  pull-requests: write

jobs:
  review_pr:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout the repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Review PR
        uses: codota/tabnine-pr-agent@v2
        continue-on-error: true
        with:
          TABNINE_KEY: ${{ secrets.TABNINE_KEY }}
          github_token: ${{ secrets.GITHUB_TOKEN }}
          repository: ${{ github.repository }}
          pull_request_number: ${{ github.event.pull_request.number }}
          head_sha: ${{ github.event.pull_request.head.sha }}
          base_sha: ${{ github.event.pull_request.base.sha }}
```

{% endcode %}
{% endstep %}

{% step %}
**Open a pull request**

Push the workflow file and open a PR. The Tabnine Code Review will run automatically and post its findings as comments.
{% endstep %}
{% endstepper %}

### Configuration

#### Required Inputs

| Input                 | Description                                                                 |
| --------------------- | --------------------------------------------------------------------------- |
| `TABNINE_KEY`         | Tabnine Personal access token. Store as a **repository secret**.            |
| `github_token`        | GitHub token for posting comments. Use the built-in `secrets.GITHUB_TOKEN`. |
| `repository`          | Repository in `owner/repo` format. Use `${{ github.repository }}`.          |
| `pull_request_number` | PR number. Use `${{ github.event.pull_request.number }}`.                   |
| `head_sha`            | PR head commit SHA. Use `${{ github.event.pull_request.head.sha }}`.        |
| `base_sha`            | PR base commit SHA. Use `${{ github.event.pull_request.base.sha }}`.        |

#### Optional Inputs

| Input          | Default                       | Description                                                              |
| -------------- | ----------------------------- | ------------------------------------------------------------------------ |
| `tabnine_host` | `https://console.tabnine.com` | Tabnine host URL (for self-hosted / EMT installations)                   |
| `model_id`     | —                             | Model ID for the AI agent. Overrides the default from the admin console. |

### Important Notes

{% hint style="warning" %}
**Full git history required.** The checkout step must use `fetch-depth: 0` so the agent can access the full diff between the PR branch and the base branch.
{% endhint %}

{% hint style="info" %}
**`continue-on-error: true`** is recommended so that a review failure does not block your CI pipeline. Code review is advisory - it should not prevent merges.
{% endhint %}

### Permissions

The workflow requires these GitHub token permissions:

| Permission      | Level   | Why                            |
| --------------- | ------- | ------------------------------ |
| `contents`      | `read`  | Read repository files and diff |
| `pull-requests` | `write` | Post review comments on the PR |

### How It Works

{% stepper %}
{% step %}
**Install the CLI**

Installs Tabnine CLI from your Tabnine host.
{% endstep %}

{% step %}
**Configure authentication**

Configures authentication using the `TABNINE_KEY` secret.
{% endstep %}

{% step %}
**Clean up previous comments**

Cleans up any previous Tabnine PR Bot comments (to avoid duplicates on re-runs).
{% endstep %}

{% step %}
**Run the agent**

Runs the agent with the configured prompt — the agent has access to the repository, the PR diff (via `gh pr diff`), shell commands, and the GitHub API.
{% endstep %}
{% endstepper %}

The agent uses the pre-authenticated `gh` CLI, so no additional API tokens are needed beyond `GITHUB_TOKEN`.

With the included code review prompt, the agent fetches the diff, classifies risk, audits the code, and posts inline comments and a summary. You can replace or extend the prompt to perform other tasks.

### Customization

#### Reviewing Only Specific Branches

Update the `on` trigger to limit which branches get reviewed:

{% code title="workflow trigger" %}

```yaml
on:
  pull_request:
    branches:
      - main
      - develop
      - 'release/**'
```

{% endcode %}

#### Using a Specific Model

Pass a `model_id` to override the default AI model:

{% code title="Using a specific model" %}

```yaml
- name: Review PR
  uses: codota/tabnine-pr-agent@v2
  continue-on-error: true
  with:
    TABNINE_KEY: ${{ secrets.TABNINE_KEY }}
    github_token: ${{ secrets.GITHUB_TOKEN }}
    repository: ${{ github.repository }}
    pull_request_number: ${{ github.event.pull_request.number }}
    head_sha: ${{ github.event.pull_request.head.sha }}
    base_sha: ${{ github.event.pull_request.base.sha }}
    model_id: "your-model-id"
```

{% endcode %}

#### Self-Hosted / Private Installations

If you run a self-hosted Tabnine instance, set the `tabnine_host` input:

{% code title="Self-hosted Tabnine host" %}

```yaml
- name: Review PR
  uses: codota/tabnine-pr-agent@v2
  continue-on-error: true
  with:
    TABNINE_KEY: ${{ secrets.TABNINE_KEY }}
    github_token: ${{ secrets.GITHUB_TOKEN }}
    repository: ${{ github.repository }}
    pull_request_number: ${{ github.event.pull_request.number }}
    head_sha: ${{ github.event.pull_request.head.sha }}
    base_sha: ${{ github.event.pull_request.base.sha }}
    tabnine_host: "https://tabnine.your-company.com"
```

{% endcode %}

### Troubleshooting

<details>

<summary>"Error: TABNINE_KEY is required"</summary>

The `TABNINE_KEY` secret is not set or is empty.

**Solution:** Add the secret in **Settings > Secrets and variables > Actions > New repository secret**. The value should be the [Personal Access Token](/main/administering-tabnine/managing-your-team/settings/access-tokens) from your Tabnine admin console.

</details>

<details>

<summary>"Error: Tabnine CLI installation failed"</summary>

The CLI installer could not be downloaded or executed.

**Solution:**

* Verify the `tabnine_host` URL is reachable from GitHub Actions runners
* If using a self-hosted runner, ensure it has internet access and Node.js 20+
* Check if your corporate firewall blocks the Tabnine host

</details>

<details>

<summary>No comments appear on the PR</summary>

The action ran but no review comments were posted.

**Possible causes:**

* The PR diff is empty or contains only low-risk changes (Tier 1 reviews may post only a summary)
* The `pull-requests: write` permission is missing from the workflow
* Check the GitHub Actions logs for errors in the "Code Review" step

</details>

<details>

<summary>Duplicate comments on re-runs</summary>

The action automatically cleans up previous Tabnine PR Bot comments before posting new ones. If duplicates appear:

**Solution:** Ensure the `github_token` has `pull-requests: write` permission, which is required for deleting old comments.

</details>

### See Also

* [Git Integrations Overview](/main/getting-started/tabnine-cli/git-integrations) — Supported platforms and review capabilities
* [GitLab CI/CD](/main/getting-started/tabnine-cli/git-integrations/gitlab-ci) — Setup for GitLab
* [Bitbucket Pipelines](/main/getting-started/tabnine-cli/git-integrations/bitbucket-pipelines) — Setup for Bitbucket


# Tabnine CLI GHA Trust Guidance

This guide outlines security configurations and best practices for integrating Tabnine CLI with GitHub Actions (GHA) workflows.

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

This guide outlines security configurations and best practices for integrating Tabnine CLI with GitHub Actions (GHA) workflows. When running Tabnine CLI in CI, you must determine whether your workflow operates on trusted or untrusted data.

### **1. Determine If Your Workflow Processes Untrusted Data**

| Data Trust Level                                                             | Required Configuration                                                            |
| ---------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
| **Fully Trusted Data** — inputs from repo owners or high-trust collaborators | Use `--approval-mode yolo` or `--yolo` in your workflow                           |
| **Untrusted Data** — GitHub issues or pull requests from non-collaborators   | Follow the hardening guidelines in Sections 2 and 3, then apply tool allowlisting |

### **2. Workspace Trust in CI**

Tabnine CLI requires the current workspace to be trusted before it will execute. In non-interactive (headless) CI environments, use one of the following approaches.

#### **`TABNINE_CLI_TRUST_WORKSPACE`**

Set this environment variable to bypass the interactive trust prompt:

```
env:
  TABNINE_CLI_TRUST_WORKSPACE: true
```

Alternatively, pass the `--skip-trust` flag, which sets the same variable for the session:

```shell
tabnine --skip-trust --approval-mode plan --prompt "Summarize the changes in this pull request."
```

### **3. Permissions and Principle of Least Privilege**

Grant only the minimum privileges necessary for the workflow to complete its task.

Set a minimal set of GitHub token permissions. Even permissions that appear downscoped can pose a security risk (e.g., `actions: write`). See GitHub's [Modifying GitHub Tokens for Least Privilege](https://docs.github.com/en/actions/tutorials/authenticate-with-github_token#modifying-the-permissions-for-the-github_token) and [Limiting Credential Permissions](https://docs.github.com/en/actions/concepts/security/secrets#limiting-credential-permissions).

Prefer workflows where a maintainer manually triggers the PR review rather than triggering automatically on forks. This prevents untrusted content from being processed without human oversight.

See GitHub's [GHA Best Practices for Security](https://docs.github.com/en/actions/reference/security/secure-use).

### **4. Tool and Command Allowlisting**

If your workflow processes untrusted data, strictly limit which tools Tabnine CLI is allowed to execute. Prefer a minimal, read-only set of tools and allowlist additional commands only if necessary.

***Example — Read-only workflow with tool allowlisting:***

```shell
tabnine --approval-mode plan 
  --allowed-tools read_file list_directory grep_search 
  --prompt "Summarize the changes in this pull request."
```

***Example — Trusted workflow using YOLO mode:***

```shell
tabnine --yolo 
  --prompt "Review this code and apply formatting fixes."
```

### **5. Approval Modes in CI**

Tabnine CLI provides four approval modes relevant to CI usage. Select the mode that matches the trust level of your workflow's data source.

| Mode        | Flag                               | Behavior                                                            |
| ----------- | ---------------------------------- | ------------------------------------------------------------------- |
| `default`   | *(none)*                           | Prompts the user for each tool call. Not suitable for headless CI.  |
| `plan`      | `--approval-mode plan`             | Read-only; no tool execution. Safe for untrusted data analysis.     |
| `auto_edit` | `--approval-mode auto_edit`        | Auto-approves file edit tools only.                                 |
| `yolo`      | `--yolo` or `--approval-mode yolo` | Auto-approves all tool calls. Use only for fully trusted workflows. |

Note that `--yolo` and `--approval-mode` are mutually exclusive; if both are passed, the CLI returns an error instructing you to use `--approval-mode=yolo` instead.

In non-interactive (headless) mode, any tool decision that would normally prompt the user (`ASK_USER`) is automatically converted to `DENY`. Pairing `plan` mode with `--allowed-tools` provides the strongest safety posture for untrusted data.

### **6. MCP Servers in CI**

If your workflow uses MCP servers, ensure that the organization's admin allowlist is configured before running Tabnine CLI in CI. Locally configured MCP servers not present in the admin allowlist are ignored at runtime. In untrusted workflows, disable MCP entirely by not passing `--allowed-mcp-server-names`, or restrict to specific trusted servers.

```shell
# Restrict to a single trusted internal MCP server
tabnine --approval-mode plan 
  --allowed-mcp-server-names internal-corp-tool 
  --prompt "Analyze the diff for security issues."
```

See [Enterprise Admin Controls](http://./tabnine-cli-admin-governance.md) for how MCP allowlists are enforced.


# Bitbucket Pipelines

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

{% hint style="warning" %}
Tabnine use is limited to one user per seat under the license agreement. If you want to use Tabnine in a CI/CD pipeline, please contact our team.
{% endhint %}

Run Tabnine CLI on every Bitbucket pull request to automate code review, documentation, test generation, and more.

### Overview

The Tabnine Bitbucket Pipeline step runs the Tabnine CLI Agent on pull request events. The included configuration provides a comprehensive code review prompt that analyzes the PR diff and posts a summary comment and inline comments directly on the pull request using the Bitbucket API. You can customize the prompt to automate any task — see [Customizing the Prompt](/main/getting-started/tabnine-cli/git-integrations#customizing-the-prompt).

### Prerequisites

* A Bitbucket repository with Pipelines enabled
* **A Tabnine account** with Agents enabled
* `TABNINE_KEY` - Tabnine [Personal access token](/main/administering-tabnine/managing-your-team/settings/access-tokens)
* `BB_API_TOKEN` - A Bitbucket access token with `pullrequest:write` and `repository:read` scopes

### Quick Setup

{% stepper %}
{% step %}
**Add repository variables**

Go to your repository's **Repository Settings > Pipelines > Repository variables** and add:

| Variable       | Value                         | Options   |
| -------------- | ----------------------------- | --------- |
| `TABNINE_KEY`  | Tabnine Personal Access Token | ✅ Secured |
| `BB_API_TOKEN` | Bitbucket access token        | ✅ Secured |
| {% endstep %}  |                               |           |

{% step %}
**Add the pipeline configuration**

Copy the `bitbucket-pipelines.yml` from the [tabnine-pr-agent repository](https://github.com/codota/tabnine-pr-agent/tree/main/Bitbucket) to the root of your Bitbucket repository.

If you already have a `bitbucket-pipelines.yml`, merge the `pull-requests` section into your existing configuration:

{% code title="bitbucket-pipelines.yml" %}

```yaml
image: node:20

pipelines:
  pull-requests:
    '**':
      - step:
          name: Tabnine Code Review
          script:
            - export TABNINE_HOST="${TABNINE_HOST:-https://console.tabnine.com}"
            - export TABNINE_MODEL_ID="${TABNINE_MODEL_ID:-}"

            # Input validation
            - |
              if [ -z "$TABNINE_KEY" ]; then
                echo "Error: TABNINE_KEY not set"
                exit 1
              fi
              if [ -z "$BB_API_TOKEN" ]; then
                echo "Error: BB_API_TOKEN not set"
                exit 1
              fi

            # Install dependencies
            - apt-get update -qq && apt-get install -y -qq curl git jq > /dev/null 2>&1

            # Install Tabnine CLI
            - |
              curl -fsSL "$TABNINE_HOST/update/cli/installer.mjs" -o installer.mjs
              node installer.mjs "$TABNINE_HOST"

            # Configure and run review
            # ... (see full configuration link below)
```

{% endcode %}

See the [full configuration](https://github.com/codota/tabnine-pr-agent/blob/main/Bitbucket/bitbucket-pipelines.yml) for the complete pipeline including authentication setup and the review prompt.
{% endstep %}

{% step %}
**Open a pull request**

Push the configuration and open a PR. The Tabnine Code Review will run automatically.
{% endstep %}
{% endstepper %}

### Configuration

#### Required Repository Variables

| Variable       | Description                                                                                        |
| -------------- | -------------------------------------------------------------------------------------------------- |
| `TABNINE_KEY`  | Tabnine authentication credentials (PAT). Mark as **Secured**.                                     |
| `BB_API_TOKEN` | Bitbucket access token with `pullrequest:write` and `repository:read` scopes. Mark as **Secured**. |

#### Optional Repository Variables

| Variable           | Default                       | Description                                                                          |
| ------------------ | ----------------------------- | ------------------------------------------------------------------------------------ |
| `TABNINE_HOST`     | `https://console.tabnine.com` | Tabnine host URL (for self-hosted / Private installations)                           |
| `TABNINE_MODEL_ID` | —                             | Model ID for the AI agent. If empty, uses the system default from the admin console. |

### Bitbucket Access Token

The `BB_API_TOKEN` is used by the agent to interact with the Bitbucket REST API — fetching PR details, reading diffs, and posting comments.

**Creating an access token:**

{% stepper %}
{% step %}
Go to **Repository Settings > Access tokens** (repository-level) or your **Personal Settings > App passwords** (account-level)
{% endstep %}

{% step %}
Create a token with `pullrequest:write` and `repository:read` scopes
{% endstep %}

{% step %}
Add it as a repository variable named `BB_API_TOKEN` and mark it as **Secured**
{% endstep %}
{% endstepper %}

{% hint style="info" %}
**Repository access tokens** are preferred over personal app passwords for CI/CD use, as they are scoped to a single repository.
{% endhint %}

### How It Works

{% stepper %}
{% step %}
**Validate inputs**

Checks that `TABNINE_KEY` and `BB_API_TOKEN` are set.
{% endstep %}

{% step %}
**Install dependencies**

Installs Tabnine CLI and required tools (`curl`, `git`, `jq`).
{% endstep %}

{% step %}
**Configure authentication and settings**

Sets up authentication and any pipeline-specific environment variables.
{% endstep %}

{% step %}
**Resolve destination commit SHA**

Uses the Bitbucket API to resolve the destination branch commit SHA.
{% endstep %}

{% step %}
**Clean up previous comments**

Removes previous Tabnine PR Bot comments from the PR.
{% endstep %}

{% step %}
**Run the review**

Fetches the PR diff via the Bitbucket API (`api.bitbucket.org/2.0`), analyzes the code, and posts summary and inline comments.
{% endstep %}
{% endstepper %}

The pipeline uses these Bitbucket predefined variables automatically:

* `BITBUCKET_WORKSPACE` — Workspace slug
* `BITBUCKET_REPO_SLUG` — Repository slug
* `BITBUCKET_PR_ID` — Pull request ID
* `BITBUCKET_COMMIT` — Head commit SHA
* `BITBUCKET_PR_DESTINATION_BRANCH` — Destination branch name

### Important Notes

{% hint style="warning" %}
The `'**'` glob pattern in the `pull-requests` section means the review runs on PRs targeting **any branch**. Adjust the pattern to limit which branches trigger reviews (e.g., `'main'` or `'develop'`).
{% endhint %}

{% hint style="info" %}
Unlike GitHub Actions, Bitbucket Pipelines does not have a built-in `continue-on-error` equivalent at the step level. The pipeline step will fail if the review encounters an error. Consider wrapping the review command in a script that always exits 0 if you want advisory-only behavior.
{% endhint %}

### Customization

#### Reviewing Only Specific Branches

Change the glob pattern to match only PRs targeting specific branches:

```yaml
pipelines:
  pull-requests:
    'main':
      - step:
          name: Tabnine Code Review
          # ...
    'develop':
      - step:
          name: Tabnine Code Review
          # ...
```

#### Using a Specific Model

Set the `TABNINE_MODEL_ID` repository variable, or set a default directly in the pipeline:

```yaml
- export DEFAULT_MODEL_ID="your-model-id"
- export TABNINE_MODEL_ID="${TABNINE_MODEL_ID:-$DEFAULT_MODEL_ID}"
```

#### Self-Hosted / Private Installations

Set the `TABNINE_HOST` repository variable, or override it in the pipeline script:

```yaml
- export TABNINE_HOST="https://tabnine.your-company.com"
```

### Troubleshooting

<details>

<summary>"Error: TABNINE_KEY not set"</summary>

The repository variable is missing or empty.

Solution: Add `TABNINE_KEY` in **Repository Settings > Pipelines > Repository variables**. Mark it as **Secured**.

</details>

<details>

<summary>"Error: BB_API_TOKEN not set"</summary>

The repository variable is missing or empty.

Solution: Create a Bitbucket access token with `pullrequest:write` and `repository:read` scopes and add it as a repository variable named `BB_API_TOKEN`.

</details>

<details>

<summary>Pipeline does not run on pull requests</summary>

Possible causes:

* Pipelines are not enabled for the repository — go to **Repository Settings > Pipelines > Settings** and enable them
* The `pull-requests` section is missing or misconfigured in `bitbucket-pipelines.yml`
* The PR target branch does not match the glob pattern

</details>

<details>

<summary>No comments appear on the PR</summary>

Possible causes:

* The `BB_API_TOKEN` lacks `pullrequest:write` scope
* The PR diff is empty or contains only low-risk changes
* Check the pipeline logs for API errors

</details>

### See Also

* [Git Integrations Overview](/main/getting-started/tabnine-cli/git-integrations) — Supported platforms and review capabilities
* [GitHub Actions](/main/getting-started/tabnine-cli/git-integrations/github-actions) — Setup for GitHub
* [GitLab CI/CD](/main/getting-started/tabnine-cli/git-integrations/gitlab-ci) — Setup for GitLab


# GitLab CI

{% hint style="warning" %}
**Tabnine CLI is in maintenance mode.** As of 6.6, we have stopped active development. It will receive only critical updates through December 31, 2026. After that, we will fully deprecate it. We are transitioning CLI users to [Tabnine Plugin for OpenCode](/main/getting-started/tabnine-plugin-for-opencode).
{% endhint %}

{% hint style="warning" %}
Tabnine use is limited to one user per seat under the license agreement. If you want to use Tabnine in a CI/CD pipeline, please contact our team.
{% endhint %}

Run Tabnine CLI on every GitLab merge request to automate code review, documentation, test generation, and more.

### Overview

The Tabnine GitLab CI job runs the Tabnine CLI Agent as a pipeline stage on merge request events. The included configuration provides a comprehensive code review prompt that analyzes the MR diff and posts a summary note and inline discussion comments directly on the merge request. You can customize the prompt to automate any task — see [Customizing the Prompt](/main/getting-started/tabnine-cli/git-integrations#customizing-the-prompt).

### Prerequisites

* A GitLab project with CI/CD pipelines enabled
* A Tabnine account with Agents enabled
* `TABNINE_KEY` - Tabnine [Personal access token](/main/administering-tabnine/managing-your-team/settings/access-tokens)
* `GITLAB_API_TOKEN` - A GitLab personal or project access token with `api` scope

### Quick Setup

{% stepper %}
{% step %}
**Add CI/CD variables**

Go to your project's **Settings > CI/CD > Variables** and add:

| Variable           | Value                                | Options                             |
| ------------------ | ------------------------------------ | ----------------------------------- |
| `TABNINE_KEY`      | Tabnine Personal Access Token        | ✅ Mask variable, ✅ Protect variable |
| `GITLAB_API_TOKEN` | GitLab access token with `api` scope | ✅ Mask variable                     |
| {% endstep %}      |                                      |                                     |

{% step %}
**Add the CI job**

Copy the `.gitlab-ci.yml` from the [tabnine-pr-agent repository](https://github.com/codota/tabnine-pr-agent/tree/main/GitLab) to the root of your GitLab repository.

If you already have a `.gitlab-ci.yml`, merge the `review` stage and `tabnine-code-review` job into your existing configuration:

{% code title=".gitlab-ci.yml" %}

```yaml
stages:
  - review

tabnine-code-review:
  stage: review
  image: node:20
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
  variables:
    TABNINE_HOST: "https://console.tabnine.com"
    TABNINE_MODEL_ID: ""
  before_script:
    # Input validation
    - |
      if [ -z "$TABNINE_KEY" ]; then
        echo "Error: TABNINE_KEY not set"
        exit 1
      fi
      if [ -z "$GITLAB_API_TOKEN" ]; then
        echo "Error: GITLAB_API_TOKEN not set"
        exit 1
      fi

    - apt-get update -qq && apt-get install -y -qq curl git jq > /dev/null 2>&1

    # Install Tabnine CLI
    - |
      curl -fsSL "$TABNINE_HOST/update/cli/installer.mjs" -o installer.mjs
      node installer.mjs "$TABNINE_HOST"
      if [ ! -f ~/.local/bin/tabnine ]; then
        echo "Error: Tabnine CLI installation failed"
        exit 1
      fi

    # Configure git
    - git config user.name "Tabnine CLI Agent"
    - git config user.email "TabnineCLI@tabnine.com"

    # Configure Tabnine Auth & Settings
    - |
      mkdir -p ~/.tabnine/agent
      MODEL_BLOCK=""
      if [ -n "$TABNINE_MODEL_ID" ]; then
        MODEL_BLOCK=",\"model\":{\"name\":\"$TABNINE_MODEL_ID\"}"
      fi
      cat << EOF > ~/.tabnine/agent/settings.json
      {
        "general": { "tabnineHost": "$TABNINE_HOST" },
        "security": { "auth": { "selectedType": "tabnine-personal" } }${MODEL_BLOCK}
      }
      EOF
      chmod 600 ~/.tabnine/agent/settings.json

  script:
    # The agent reviews the MR diff and posts comments
    - TABNINE_TOKEN=$TABNINE_KEY ~/.local/bin/tabnine -y -p "<REVIEW_PROMPT>"
  allow_failure: true
```

{% endcode %}

See the [full configuration](https://github.com/codota/tabnine-pr-agent/blob/main/GitLab/.gitlab-ci.yml) for the complete review prompt.
{% endstep %}

{% step %}
**Open a merge request**

Push the configuration and open an MR. The Tabnine Code Review job will run automatically.
{% endstep %}
{% endstepper %}

### Configuration

#### Required CI/CD Variables

| Variable           | Description                                                                   |
| ------------------ | ----------------------------------------------------------------------------- |
| `TABNINE_KEY`      | Tabnine PAT. Mark as **Masked** and **Protected**.                            |
| `GITLAB_API_TOKEN` | GitLab personal or project access token with `api` scope. Mark as **Masked**. |

#### Optional CI/CD Variables

| Variable           | Default                       | Description                                                                          |
| ------------------ | ----------------------------- | ------------------------------------------------------------------------------------ |
| `TABNINE_HOST`     | `https://console.tabnine.com` | Tabnine host URL (for self-hosted / EMT installations)                               |
| `TABNINE_MODEL_ID` | —                             | Model ID for the AI agent. If empty, uses the system default from the admin console. |

### GitLab API Token

The `GITLAB_API_TOKEN` is used by the agent to interact with the GitLab API — fetching MR details, reading diffs, and posting comments.

**Creating a token:**

{% stepper %}
{% step %}
Go to **User Settings > Access Tokens** (personal) or **Project Settings > Access Tokens** (project-scoped)
{% endstep %}

{% step %}
Create a token with the `api` scope
{% endstep %}

{% step %}
Set an appropriate expiration date
{% endstep %}

{% step %}
Add it as a CI/CD variable named `GITLAB_API_TOKEN`
{% endstep %}
{% endstepper %}

{% hint style="info" %}
**Project access tokens** are preferred over personal tokens for CI/CD use, as they are scoped to a single project and can be managed independently.
{% endhint %}

### How It Works

{% stepper %}
{% step %}
Validates that `TABNINE_KEY` and `GITLAB_API_TOKEN` are set
{% endstep %}

{% step %}
Installs Tabnine CLI and dependencies (`curl`, `git`, `jq`)
{% endstep %}

{% step %}
Configures authentication and settings
{% endstep %}

{% step %}
Cleans up previous Tabnine PR Bot notes from the MR
{% endstep %}

{% step %}
Runs the review — the agent uses the GitLab API (`$CI_API_V4_URL`) to fetch MR changes, analyze the diff, and post notes and discussion comments
{% endstep %}
{% endstepper %}

The job uses these GitLab CI predefined variables automatically:

* `CI_API_V4_URL` — GitLab API base URL
* `CI_PROJECT_ID` — Project ID
* `CI_MERGE_REQUEST_IID` — MR internal ID
* `CI_MERGE_REQUEST_DIFF_HEAD_SHA` — Head commit SHA
* `CI_MERGE_REQUEST_DIFF_BASE_SHA` — Base commit SHA

### Important Notes

{% hint style="warning" %}
**`allow_failure: true`** is recommended so that a review failure does not block your CI pipeline. Code review is advisory — it should not prevent merges.
{% endhint %}

{% hint style="info" %}
The job only runs on merge request events (`$CI_PIPELINE_SOURCE == "merge_request_event"`). It will not trigger on regular branch pushes.
{% endhint %}

### Customization

#### Using a Specific Model

Set the `TABNINE_MODEL_ID` CI/CD variable in **Settings > CI/CD > Variables**, or override it in the job:

{% code title="Override model in job" %}

```yaml
tabnine-code-review:
  variables:
    TABNINE_MODEL_ID: "your-model-id"
```

{% endcode %}

#### Self-Hosted / EMT Installations

Set the `TABNINE_HOST` variable:

{% code title="Override host in job" %}

```yaml
tabnine-code-review:
  variables:
    TABNINE_HOST: "https://tabnine.your-company.com"
```

{% endcode %}

### Troubleshooting

<details>

<summary>"Error: TABNINE_KEY not set"</summary>

The CI/CD variable is missing or empty.

**Solution:** Add `TABNINE_KEY` in **Settings > CI/CD > Variables**. Mark it as **Masked** and **Protected**.

</details>

<details>

<summary>"Error: GITLAB_API_TOKEN not set"</summary>

The CI/CD variable is missing or empty.

**Solution:** Create a GitLab access token with `api` scope and add it as a CI/CD variable named `GITLAB_API_TOKEN`.

</details>

<details>

<summary>Job does not run on merge requests</summary>

The pipeline is not triggered by merge request events.

**Possible causes:**

* The `rules` block is missing or misconfigured
* The project does not have **Merge request pipelines** enabled
* Check that the rule is: `if: '$CI_PIPELINE_SOURCE == "merge_request_event"'`

</details>

<details>

<summary>No comments appear on the MR</summary>

**Possible causes:**

* The `GITLAB_API_TOKEN` lacks `api` scope
* The MR diff is empty or contains only low-risk changes
* Check the job logs for API errors

</details>

### See Also

* [Git Integrations Overview](/main/getting-started/tabnine-cli/git-integrations) — Supported platforms and review capabilities
* [GitHub Actions](/main/getting-started/tabnine-cli/git-integrations/github-actions) — Setup for GitHub
* [Bitbucket Pipelines](/main/getting-started/tabnine-cli/git-integrations/bitbucket-pipelines) — Setup for Bitbucket


# Code Completions

{% hint style="info" %}
**This feature is available in the following IDEs:**

VS Code, JetBrains IDEs, Visual Studio 2022 and Eclipse
{% endhint %}

As you code in your IDE, you’ll get AI code suggestions based on your current context. The code completions adapt to your code as you type, and can offer on-the-fly code completions, full-function completions, or even natural language comments to code.

Tabnine’s code completions can help save significant time and effort when you’re writing or revising code. For example, by writing lines of code for you or by providing exact syntax, Tabnine saves you the time and effort of looking it up when you can’t remember something.

### Getting started with code completions <a href="#getting-started-with-code-completions" id="getting-started-with-code-completions"></a>

#### **Get Tabnine’s code suggestions**

As you code, you’ll see Tabnine’s code suggestions inline in gray (in addition to the IDE’s pop-up suggestions):

![](https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-9846414a9ad438703906ab6f2025465f55f0d175%2FGetting%20started_gray.png?alt=media)

#### **Accept a code suggestion**

Hit Tab to accept a code suggestion:

![](https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-a4996b658b19c619c0b8866072c3ed0c881c652a%2FGetting%20the%20most%20of%20cc.gif?alt=media)

#### Accept part of a code completion

In some IDEs (VS Code and JetBrains), you can accept just part of a code completion:

* Line by line (VS Code and JetBrains)
* Word by word (VS Code)

{% hint style="info" %}
To set the key shortcut for accepting part of a code completion:

**JetBrains**\
Go to **Settings... > Keymap > Plugins > Tabnine > Accept Line**

**VS Code**\
Go to **Command Palette ... > Preferences: Open Keyboard Shortcuts > Accept Next Line (or Word) Of Inline Suggestion**
{% endhint %}

This is especially useful for code multiline code completions when you need only the first part of the completion.

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-2f542896fde48e9e030e25f32ed669241ab82cd0%2FCompletions%20line%20by%20line%20-%20JB%20Edited.gif?alt=media" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
**Tips**

1. Use descriptive functions and variable names for accurate predictions.
2. If the current suggestion isn’t what you need, try typing a few more characters to use slightly different functions or variable names.
   {% endhint %}

### Types of code completions provided by Tabnine <a href="#types-of-code-completions-provided-by-tabnine" id="types-of-code-completions-provided-by-tabnine"></a>

#### Whole-line suggestions

As you code, you’ll get code suggestions based on your current context, which adapts with every additional character you type. This is the most common type of code completion, suggesting code until the end of the current line.

**Tip:** Use descriptive functions and variable names for accurate predictions.

![Whole-line suggestion (1)](https://2500895905-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F03uIXF1SrI5fdiuQqdFr%2Fuploads%2FbqEcHiBFiuU7mUZyWVff%2F3.png?alt=media\&token=87e1657a-0221-4146-8513-3164986ef8c6)

![Whole-line suggestion (2)](https://2500895905-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F03uIXF1SrI5fdiuQqdFr%2Fuploads%2F4G0oNiiRVyhiXL9zdYyK%2F4.png?alt=media\&token=c7fd3eb6-a5d4-491e-a365-411b6ac706d0)

#### Full-function suggestions

When you get to a new line right after a function declaration, you’ll receive a suggestion for a full-function implementation. Again, we recommend using descriptive functions and variable names for accurate predictions.

If the full function isn’t what you expected, try using slightly different names:

![Full-function suggestion (1)](https://2500895905-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F03uIXF1SrI5fdiuQqdFr%2Fuploads%2FUyRlTF1YbM5DLUCYReGx%2F5.png?alt=media\&token=905ba41c-0f24-4acb-8a77-74b161a6990a)

![Full-function suggestion (2)](https://2500895905-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F03uIXF1SrI5fdiuQqdFr%2Fuploads%2FsFCVlem97vjU8Y0ZsFpO%2F6.png?alt=media\&token=eb7b636d-8cdb-4290-903b-9e33938147a9)

**Comment-to-code completions**

This type of completion allows you to explicitly declare what you want as a comment in natural language. On the line after the comment, Tabnine will suggest code that performs this task.

If the code isn’t what you were expecting, try using slightly different instructions:

![Natural language to code (1)](https://2500895905-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F03uIXF1SrI5fdiuQqdFr%2Fuploads%2FRy11PzaGTfbIun4WxHWd%2F7.png?alt=media\&token=0d3d1e19-bc9f-427b-af6c-9f9d2b59cbe2)

![Natural language to code (2)](https://2500895905-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F03uIXF1SrI5fdiuQqdFr%2Fuploads%2FUx1Ye647KNJH1KDnOMh7%2F8.png?alt=media\&token=7e893981-8437-4edc-acc0-dd16e8489567)


# Code Acceptance Logs

Code Acceptance Logging tracks all explicit acceptances of code recommendations by the use or code recommended by Tabnine.

**Code Acceptance Logging** tracks all explicit acceptances of code recommendations by the use or code recommended by Tabnine. These logs can be leveraged for compliance needs. This applies both to our IDE plugin and the Tabnine CLI.

{% hint style="info" %}
Code Acceptance collection is turned off by default and requires an explicit request from an Admin to enable it. To activate this service and access all Acceptance Logs, please contact <support@tabnine.com>.
{% endhint %}

{% hint style="info" %}
This is only available for self-hosted instances.
{% endhint %}

AI-generated code accepted via the Agent ([v6.3.0](https://docs.tabnine.com/main/getting-started/code-completion/pages/risy3bTOlfBfgFRRXK8K#v6.3.0)) and CLI ([v6.3.0](https://docs.tabnine.com/main/getting-started/code-completion/pages/risy3bTOlfBfgFRRXK8K#v6.3.0)) is logged alongside existing code completion logging. All accepted code is traceable and accessible for organization admins. Accepted code may come from any of these code generation sources (in both our IDE plugin and the Tabnine CLI):

1. [Tabnine Agent](/main/getting-started/tabnine-agent)
2. [Tabnine Chat](/main/getting-started/tabnine-chat)
3. [Code Completions](/main/getting-started/code-completion)
4. [Test Agent](https://github.com/codota/docs/blob/main/main/getting-started/getting-the-most-from-tabnines-code-completion/broken-reference/README.md)

All logs will include standard information such as:

1. Full accepted code snippet
2. Timestamp of the acceptance event
3. Session ID
4. Source of generation (agent, cli, chat, or code completion)
5. Model name
6. User ID
7. Team ID

\
Admins can export logs via the Admin Console using the Download as CSV button or via API. Exports support filtering by date range and source.


# Pause Code Completions

{% hint style="info" %}
Available in VS Code, JetBrains plugins, Visual Studio & Eclipse
{% endhint %}

## Pause/Resume Tabnine's Code Completions

Click on the Tabnine logo on your IDE's status bar.

{% tabs %}
{% tab title="VS Code" %}

1. The following notification appears:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-393ce0cc7cea1a7e11754297cae7d09717d911cd%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

2. Click **Pause Tabnine Completions.**
3. The **Tabnine Enterprise logo** will change to **disabled** **mode** and you won't get code completions:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-9c5d77784a1271e7b2fbda25a34b4cbf34a9890b%2FTabnine%20Ent.png?alt=media" alt="" width="375"><figcaption></figcaption></figure>

**Resume code completions**

1. To resume Tabnine's Code Completions, click again on the Tabnine logo.
2. In the following menu click, **Resume Tabnine Completions:**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-015a1538d54cc95cca75e094886a5b525f4d3f43%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="JetBrains IDEs, Eclipse, and Visual Studio 2022" %}

1. The following menu will show:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-4311589fb10d0841db9ab6c095af900aa597247b%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
The logo might appear like this:

<img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-561c2b12a31dde7f6639d54e2c01eb511295368a%2FTabnine%20Ent%20wh%20bold.png?alt=media" alt="" data-size="original">
{% endhint %}

2. Click **Pause Tabnine Completions.**
3. The **Tabnine logo** will change to **disabled** **mode** and you won't get code completions:

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-d004fab5cb892fa315db7b5c07870b13e978587a%2FTabnine%20Ent%20bold.png?alt=media" alt="" width="375"><figcaption></figcaption></figure>

**Resume Code Completions**

1. To resume Tabnine's code completions, click again on the Tabnine / Tabnine Enterprise logo.
2. In the following menu, click **Resume Tabnine Completions:**

<figure><img src="https://3436682446-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY2qxVf5VTm3fmwP4B4Gx%2Fuploads%2Fgit-blob-d1bfa521c9cc4f238d44e0f3d69298f2ca7a7f70%2FTabnine%20Resume%20Pycharm.png?alt=media" alt="" width="375"><figcaption></figcaption></figure>
{% endtab %}
{% endtabs %}

{% hint style="warning" %}
The "Snooze Interval" setting in VSCode was deprecated with v5.20.0
{% endhint %}


# Tabnine's Prompting Guide

## **Defining a Prompting Strategy for Code Projects**

Every project is going to require a different strategy based on your priorities. Effective prompting starts with structured thinking.

In Tabnine, you’re not just prompting a text model, but an Agent that has access to your codebase, open files, and custom commands.

A good prompt doesn’t just describe what you want but instructs the Agent *how* to operate in your project: what it can look at, what rules to follow, and what to leave alone.

***

#### **A. Specify the Key Elements**

When designing a prompt, clarify the following:

1. **The Task:**
   * What are you trying to achieve? What’s the ‘goal state’? What should the result be?
   * *Example*: "Apply the extract method for refactoring to this code."
2. **Context:**
   * What is the source material you’re working from, and where should the agent look (open file, specific path, remote repo)?
   * *Example*: "@related\_class" or "See the implementation in `utils/helpers.py`."
3. **Constraints**: What boundaries or conditions must be respected?
   * *Example*: "Keep current behavior. Preserve function signatures."

| Note: It is best to avoid *negative prompting*. A negative version of the above example would be "Do not change behavior. Preserve function signatures." |
| -------------------------------------------------------------------------------------------------------------------------------------------------------- |

4. **Process:** What are the instructions, or how should the agent approach the work step-by-step?
   * *Example*: "Start by identifying duplicate logic, then suggest reusable methods."
5. **Validation**: What signals indicate that the prompt was successful?
   * *Example*: "Refactored code should pass all existing tests."
6. **Format**: How should the output be structured?
   * *Example*: "Respond with a JSON object containing `method_name`, `start_line`, and `new_code`."
7. **(Re-)Iteration Plan**: What are the next steps if the first output isn’t perfect? Treat this like directing a junior engineer: tell the agent when to pause, ask questions, or request approval before applying large changes.
   * *Example*: "After generating the refactor, ask: 'Do you want to apply this to other classes?'"
8. **Ask for Feedback** *(optional)*:
   * *Example*: "If this approach looks flawed, explain why and propose an alternative."

***

**Template Example**

```
Goal: Apply extract method refactoring to the selected function
Source: @related_class
Constraints:
  - Do not change behavior
  - Maintain interface compatibility
Process:
  - Identify duplicate code blocks
  - Suggest method names based on action
Validation: Must retain all unit test coverage
Format: List of changes in JSON:
  [
    {
      "method_name": "...",
      "start_line": ...,
      "new_code": "..."
    }
  ]
Next Step: Ask if similar changes should be applied elsewhere
Feedback: Flag any logic that may not refactor cleanly
```

***

**When using Tabnine as an Agent over your codebase, be explicit about scope and permissions:**

* **Scope: “Only modify this file and test files in `/tests/user/`.”**
* **Permissions: “Do not create new services; only change existing methods.”**
* **Safety checks: “Before proposing changes, summarize what you understood about the current behavior.”**

**Why This Works**

A prompting strategy aligns the LLM with your development mindset. Instead of fishing for the right phrasing, you define a clear lane for the model to operate in—resulting in better, faster, and more predictable completions.


# Prompt Iteration and Follow-ups

### Prompting isn’t so much a command-and-control process as much as it is a conversation. Throughout any conversation, you gauge if your conversation partner ‘gets’ what you’re saying. That’s the same here.

With that in mind, here are some important tips:

1. **Start off small, then go deeper.** – Consider how you would introduce a new topic to a class of beginners, but then also how you would go into detail. It should be a process without assuming the student understands everything right away.
2. **Read&#x20;*****into*****&#x20;the LLM’s answer.** – Evaluate the details of each LLM response. See if they are responding in a way that someone who understands your comments would.
3. **Distill**. – Refine what you mean in the feedback of *your* response.
   1. Reference previous responses (“in your last response” / “in the code you just generated”)
   2. “Can you try again but treat this as a Vue 3 project (Composition API) and update only the current component file?”
4. **Ask for clarification.** – Ask the model itself to reissue the response to be sure it understands you right:
   1. “Can you rephrase that in layman’s terms?”
   2. “That’s close—just take this in mind…”
   3. “Please show me what you mean.” / “Add a test case for that example.”
   4. ### “Actually, I meant a recursive version, not iterative.”
   5. ### “This is good, but can you include error handling?”

###

Like a good manager, be specific about what you want to critique in each comment. With an agent, each follow-up prompt is a course correction: tell it what to inspect next, what to stop doing, and what new constraints now apply.

**Tip:**

### Avoid vague corrections like “That’s not what I meant.” Instead, **explicitly say what you want changed.**

### **A. When to clarify or restart**

### Use **clarification** when the thread’s still salvageable. Use **restart** when history becomes baggage. In Tabnine, that means clicking “New Conversation” to ensure a clean context window.

### ---

* ### If the model is **only a little wrong**, clarify.
* ### If you find yourself typing **“Forget what I said earlier…”**, restart.

| Situation                                  | Recommended Action | Justification                                                                                                                                                                                     |
| ------------------------------------------ | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Minor misunderstanding                     | Clarify            | The model likely retained the correct context but misinterpreted or guessed incorrectly on a detail. A follow-up (e.g., “Use a hashmap instead”) typically corrects this without needing a reset. |
| Response is correct but incomplete         | Clarify            | The model is aligned with your goal—just nudge it further. Follow-ups like “Add edge case handling” work well here and preserve useful context.                                                   |
| Model keeps misunderstanding core intent   | Restart            | If several clarifications don’t resolve the confusion, context drift has likely occurred. Old messages may bias the model, so a fresh thread is cleaner and more efficient.                       |
| You introduced unrelated topics mid-thread | Restart            | LLMs prioritize recency but can mix topics. Starting fresh ensures the new task isn’t contaminated by unrelated context.                                                                          |
| You see weird or contradictory output      | Restart            | This often signals corrupted or conflicting memory—especially when the model contradicts itself or changes direction erratically.                                                                 |
| Tabnine/LLM refers to outdated messages    | Restart            | When it hallucinates old input or can’t seem to "forget" a shift in scope, a restart ensures that only your new input is influencing the response.                                                |

###

### **B. Code Formatting for Accuracy**

When prompting with or about code, **format it cleanly and consistently**—as if you were writing for a teammate doing code review.

#### **Why It Matters:**

Large Language Models (LLMs) like Tabnine rely heavily on **token structure** and **formatting cues** to interpret what your intent is. Sloppy or inconsistent formatting introduces ambiguity, which leads to vague, broken, or off-target responses.

***

#### **Recommended Formatting Tactics**

| Technique                                | Example                                                      | Why It Helps                                                 |
| ---------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| **Use syntax-highlighted code blocks**   | `python<br>```python<br>def get_user():<br> pass<br>```<br>` | Ensures model parses it as *code*, not prose.                |
| **Label your code explicitly**           | “Here’s my `User` class”                                     | Adds semantic clarity—models use these cues to match intent. |
| **Show input/output clearly**            | `Input: [1, 2, 3] → Output: 6`                               | Enables better example matching and test generation.         |
| **Break long prompts into parts**        | “Here’s the class. Now write a test.”                        | Modular input improves comprehension and results.            |
| **Avoid inline code in long paragraphs** | Don't bury `def` or `var` calls in walls of text             | Makes parsing harder; model may ignore or mangle it.         |

***

#### **Common Pitfalls**

| Pitfall                                        | Impact                                                  |
| ---------------------------------------------- | ------------------------------------------------------- |
| Missing indentation                            | LLM assumes malformed logic or syntax                   |
| Incomplete snippets                            | LLM guesses the rest—often incorrectly                  |
| Mixed languages or styles                      | Confuses intent; may switch languages mid-reply         |
| Describing code in prose instead of pasting it | Increases hallucination risk; LLM has to infer too much |

***

#### **Prompt Examples**

**Less Effective:**

Can you help fix my function that checks if a string is a palindrome?

**More Effective:**

python

CopyEdit

` ```python `

`def is_palindrome(s):`

`return s == s[::-1]`

` ``` `

`Can you help me fix the indentation and make sure it works for input with spaces and punctuation?`

### **C. Be Concise but Complete**

While prompts often need to grow gradually as you refine a task, it’s just as important to know when to scale back. This balance is what keeps prompts concise: specific and tight, without becoming overly descriptive.

Things to keep in mind when maintaining a concise prompt (most of which we’ve already discussed):

1. Start small, then expand only as misunderstanding appears.
2. Keep additions short and targeted.
3. Stay clear and focused on the goal.

| !Note: Conciseness isn’t the same as avoiding *redundancy*. Redundancy can sometimes be necessary for clarity; conciseness is about keeping the prompt free of anything that doesn’t move the task forward. |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

Consider these examples:

#### **Too Vague**

| `Can you help me with reading my CSV in Python? I need it to have name, age, and email.` |
| ---------------------------------------------------------------------------------------- |

This is extremely vague. Even if you have attached the CSV file, this leaves the model to make interpretations on its own. It might infer that you have that data in the file already, or it might hallucinate 'filler' data to ensure there are some names, ages, and email addresses.

While models continue to get better at inference through context, this sort of thing should not be left to chance anymore than you would with giving instructions to a human.

#### **Too Verbose**

| `I have this CSV file I’m trying to read in Python, but I’m not sure how to handle it correctly. The file has some columns like name, age, and email. I think I should probably use the CSV module but I’m not positive. Also I need to print each row, but I don’t want the program to crash if the file is missing or the path is wrong. Could you maybe write a function for me? I’m using Python 3.11. I want it to gracefully handle errors and just read the file and print everything in a clean format. I’m not sure if I’m thinking about it the right way, so feel free to correct any assumptions.` |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

With LLMs, you need to be more definitive.

“Could you maybe,” “should probably,” and “I’m not sure if I’m thinking about it the right way” signal a lot of wiggle room to the model.

It needs a clear task (and order of priority if covering multiple tasks). Otherwise, extra narrative, pleasantries, and words might confuse the LLM on the priorities of your request.

#### **Just Right**

| `Write a Python 3.11 function that reads a CSV file with the columns name, age, and email. Use the csv module, print each row, and raise a FileNotFoundError if the file does not exist. Keep the implementation simple and readable.` |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

This gets the best of both worlds from the previous two examples:

1. Clear task (*Write a Python 3.11 function that reads a CSV file with the columns name, age, and email.*)
2. Clear parameters. (*Use the csv module, print each row, and raise a FileNotFoundError if the file does not exist.*)
3. Clear notes about style at the end (*Keep the implementation simple and readable.*)




---

[Next Page](https://docs.tabnine.com/main/llms-full.txt/1)

