# đ Explicação Simples: Sistema de Versionamento de Toolkits
## đ€ O que Ă©?
O sistema de versionamento permite que vocĂȘ controle **qual versĂŁo** de cada toolkit (GitHub, Gmail, Slack, etc.) seu aplicativo vai usar.
Pense nisso como escolher qual versĂŁo de um aplicativo vocĂȘ quer instalar no seu celular - vocĂȘ pode usar a mais recente ("latest") ou uma versĂŁo especĂfica ("20250906_01").
---
## đŻ Por que Ă© importante?
### Problema sem versionamento:
```
Seu app funciona hoje â
Composio atualiza o toolkit do GitHub đ
Seu app quebra amanhĂŁ â
```
### Solução com versionamento:
```
Seu app usa GitHub versĂŁo "20250906_01" â
Composio atualiza o toolkit do GitHub đ
Seu app continua funcionando â
(usa a versĂŁo antiga)
VocĂȘ testa a nova versĂŁo quando quiser đ§Ș
VocĂȘ atualiza quando estiver pronto đ
```
---
## đ Conceitos BĂĄsicos
### 1. ToolkitVersion (VersĂŁo de um Toolkit)
```rust
// Duas opçÔes:
ToolkitVersion::Latest // Sempre usa a mais recente
ToolkitVersion::Specific("20250906_01") // Usa uma versĂŁo especĂfica
```
**Analogia**: Ă como escolher entre "sempre atualizar automaticamente" ou "ficar nesta versĂŁo".
### 2. ToolkitVersionParam (Configuração de VersÔes)
```rust
// TrĂȘs opçÔes:
// Opção 1: Usar "latest" para TODOS os toolkits
ToolkitVersionParam::Latest
// Opção 2: Especificar versão para cada toolkit
let mut versions = HashMap::new();
versions.insert("github".to_string(), ToolkitVersion::Specific("20250906_01".to_string()));
versions.insert("gmail".to_string(), ToolkitVersion::Latest);
ToolkitVersionParam::Versions(versions)
// Opção 3: Não especificar (usa "latest" por padrão)
ToolkitVersionParam::None
```
**Analogia**: Ă como configurar atualizaçÔes automĂĄticas no seu celular - vocĂȘ pode escolher "sempre atualizar tudo", "escolher app por app", ou "deixar no padrĂŁo".
---
## đ Como funciona?
### Passo 1: Configurar no Client
```rust
let client = ComposioClient::builder()
.api_key("sua_chave")
.toolkit_versions(ToolkitVersionParam::Latest) // Configuração aqui
.build()?;
```
### Passo 2: Session herda automaticamente
```rust
let session = client.create_session("user_123").send().await?;
// Session jå tem as versÔes configuradas!
```
### Passo 3: Execução resolve versão automaticamente
```rust
// Quando vocĂȘ executa uma ferramenta:
session.execute_tool("GITHUB_CREATE_ISSUE", args).await?;
// Internamente acontece:
// 1. Extrai "github" de "GITHUB_CREATE_ISSUE"
// 2. Verifica variĂĄvel de ambiente COMPOSIO_TOOLKIT_VERSION_GITHUB
// 3. Se não tiver, usa a configuração do client
// 4. Se nĂŁo tiver, usa COMPOSIO_TOOLKIT_VERSION (global)
// 5. Se nĂŁo tiver, usa "latest"
// 6. Passa a versĂŁo resolvida para a API
```
---
## đïž Ordem de PrecedĂȘncia
Imagine uma hierarquia de "quem manda mais":
```
1. COMPOSIO_TOOLKIT_VERSION_GITHUB=20250906_01 đ Rei (manda mais)
2. Client config: toolkit_versions đ€Ž PrĂncipe
3. COMPOSIO_TOOLKIT_VERSION=latest đš CidadĂŁo
4. Default: "latest" đŁ PadrĂŁo
```
**Exemplo prĂĄtico:**
```bash
# VocĂȘ configura no cĂłdigo:
client.toolkit_versions(github: "20250801_01")
# Mas define variĂĄvel de ambiente:
export COMPOSIO_TOOLKIT_VERSION_GITHUB=20250906_01
# Resultado: Usa 20250906_01 (env var vence!)
```
---
## đĄ Casos de Uso
### Caso 1: Desenvolvimento (sempre atualizado)
```rust
let client = ComposioClient::builder()
.api_key("key")
.toolkit_versions(ToolkitVersionParam::Latest)
.build()?;
```
**Quando usar**: Desenvolvimento local, testes, protĂłtipos
### Caso 2: Produção (versÔes fixas)
```rust
let mut versions = HashMap::new();
versions.insert("github".to_string(), ToolkitVersion::Specific("20250906_01".to_string()));
versions.insert("gmail".to_string(), ToolkitVersion::Specific("20250801_01".to_string()));
let client = ComposioClient::builder()
.api_key("key")
.toolkit_versions(ToolkitVersionParam::Versions(versions))
.build()?;
```
**Quando usar**: Produção, aplicaçÔes crĂticas, quando precisa de estabilidade
### Caso 3: HĂbrido (alguns fixos, outros latest)
```rust
let mut versions = HashMap::new();
versions.insert("github".to_string(), ToolkitVersion::Specific("20250906_01".to_string()));
versions.insert("gmail".to_string(), ToolkitVersion::Latest);
let client = ComposioClient::builder()
.api_key("key")
.toolkit_versions(ToolkitVersionParam::Versions(versions))
.build()?;
```
**Quando usar**: Quando alguns toolkits sĂŁo crĂticos e outros podem atualizar
### Caso 4: Override por usuĂĄrio
```rust
// Cliente padrĂŁo
let client = ComposioClient::builder()
.api_key("key")
.toolkit_versions(ToolkitVersionParam::Latest)
.build()?;
// UsuĂĄrio especĂfico precisa de versĂŁo antiga
let mut user_versions = HashMap::new();
user_versions.insert("github".to_string(), ToolkitVersion::Specific("20250801_01".to_string()));
let session = client
.create_session("user_vip")
.toolkit_versions(ToolkitVersionParam::Versions(user_versions))
.send()
.await?;
```
**Quando usar**: Quando diferentes usuårios precisam de versÔes diferentes
---
## đ Debugging
### Como saber qual versĂŁo estĂĄ sendo usada?
```rust
use composio_sdk::utils::toolkit_version::get_toolkit_version;
let version = get_toolkit_version("github", client.config().toolkit_versions.as_ref());
println!("Usando versĂŁo: {}", version.as_str());
```
### Como testar uma nova versĂŁo?
```bash
# Opção 1: Variåvel de ambiente (temporårio)
export COMPOSIO_TOOLKIT_VERSION_GITHUB=20250906_01
cargo run
# Opção 2: Mudar no código (permanente)
versions.insert("github".to_string(), ToolkitVersion::Specific("20250906_01".to_string()));
```
---
## â ïž Armadilhas Comuns
### â Erro 1: Usar "latest" em produção
```rust
// RUIM para produção
let client = ComposioClient::builder()
.toolkit_versions(ToolkitVersionParam::Latest)
.build()?;
```
**Por quĂȘ?** Seu app pode quebrar quando Composio atualizar.
### â Erro 2: Esquecer de atualizar versĂ”es
```rust
// VersĂŁo muito antiga
versions.insert("github".to_string(), ToolkitVersion::Specific("20240101_01".to_string()));
```
**Por quĂȘ?** VocĂȘ perde novos recursos e correçÔes de bugs.
### â Erro 3: NĂŁo testar antes de atualizar
```rust
// Atualizar direto em produção
versions.insert("github".to_string(), ToolkitVersion::Latest);
```
**Por quĂȘ?** Pode ter breaking changes.
---
## â
Boas PrĂĄticas
### 1. Desenvolvimento: Use "latest"
```rust
#[cfg(debug_assertions)]
let versions = ToolkitVersionParam::Latest;
```
### 2. Produção: Use versĂ”es especĂficas
```rust
#[cfg(not(debug_assertions))]
let versions = ToolkitVersionParam::Versions(production_versions);
```
### 3. Teste novas versÔes em staging
```bash
# Staging
export COMPOSIO_TOOLKIT_VERSION_GITHUB=20250906_01
# Produção (só depois de testar)
versions.insert("github".to_string(), ToolkitVersion::Specific("20250906_01".to_string()));
```
### 4. Documente as versÔes usadas
```rust
// versions.toml
// github = "20250906_01" # Testado em 2026-03-08
// gmail = "20250801_01" # Testado em 2026-02-15
```
---
## đ Resumo para Iniciantes
1. **O que é?** Sistema para controlar versÔes de toolkits
2. **Por que usar?** Evitar que seu app quebre com atualizaçÔes
3. **Como usar?** Configurar no client builder
4. **Quando usar "latest"?** Desenvolvimento e testes
5. **Quando usar versĂ”es especĂficas?** Produção
6. **Como testar?** VariĂĄveis de ambiente
7. **Como debugar?** `get_toolkit_version()`
---
## đ PrĂłximos Passos
1. Leia o exemplo completo: `examples/toolkit_versioning_integration.rs`
2. Execute: `cargo run --example toolkit_versioning_integration`
3. Experimente com variĂĄveis de ambiente
4. Teste em seu projeto
---
**DĂșvidas?** Consulte:
- `docs/01-INTEGRATION_PLAN.md` - Plano técnico detalhado
- `docs/01-CHANGES_IMPLEMENTED.md` - O que foi implementado
- `examples/toolkit_versioning.rs` - Exemplo bĂĄsico
- `examples/toolkit_versioning_integration.rs` - Exemplo completo
---
**Lembre-se**: Versionamento Ă© como um seguro - vocĂȘ espera nunca precisar, mas fica feliz quando tem! đĄïž