biatoolkit 1.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,492 @@
1
+ Metadata-Version: 2.4
2
+ Name: biatoolkit
3
+ Version: 1.2.0
4
+ Summary: Biblioteca para desenvolvedores que utilizam o BiaAgentBuilder
5
+ Author: Bia Platform Team
6
+ Author-email: data.platform@sankhya.com.br
7
+ Classifier: Programming Language :: Python :: 3
8
+ Classifier: License :: OSI Approved :: MIT License
9
+ Classifier: Operating System :: OS Independent
10
+ Requires-Python: >=3.10
11
+ Description-Content-Type: text/markdown
12
+ Dynamic: author
13
+ Dynamic: author-email
14
+ Dynamic: classifier
15
+ Dynamic: description
16
+ Dynamic: description-content-type
17
+ Dynamic: requires-python
18
+ Dynamic: summary
19
+
20
+ # Bia Toolkit
21
+
22
+ Biblioteca Python para facilitar o desenvolvimento de servidores MCP integrados ao **Bia Agent Builder**.
23
+
24
+ O objetivo da Bia Toolkit é abstrair detalhes técnicos do MCP (Model Context Protocol),
25
+ fornecendo utilitários prontos para:
26
+ - Comunicação com servidores MCP
27
+ - Leitura de contexto do runtime (headers)
28
+ - Recuperação segura de parâmetros e segredos
29
+
30
+ ---
31
+
32
+ ## Principais classes da biblioteca
33
+
34
+ ### BiaClient
35
+
36
+ A classe `BiaClient` encapsula um cliente HTTP assíncrono para comunicação com servidores MCP
37
+ (Model Context Protocol).
38
+
39
+ Ela esconde toda a complexidade de:
40
+ - Conexão HTTP streamable
41
+ - Inicialização de sessões MCP
42
+ - Execução de tools
43
+
44
+ #### Principais métodos
45
+
46
+ - **list_tools()**
47
+ - Lista todas as ferramentas disponíveis no servidor MCP.
48
+
49
+ - **call_tool(tool_name, params=None)**
50
+ - Executa uma ferramenta específica disponível no servidor MCP.
51
+
52
+ ---
53
+
54
+ ### BiaUtil
55
+
56
+ A classe `BiaUtil` fornece métodos auxiliares para uso **dentro de MCP Servers**,
57
+ permitindo acesso fácil a:
58
+ - Headers padronizados enviados pelo runtime do Bia Agent Builder
59
+ - Parâmetros sensíveis vindos de variáveis de ambiente ou cofre de segredos (AWS SSM)
60
+
61
+ #### Principais métodos
62
+
63
+ - **construtor**
64
+ - Recebe uma instância de `FastMCP` para acessar o contexto da requisição atual.
65
+
66
+ - **get_header()**
67
+ - Extrai e retorna os headers customizados do runtime.
68
+ - Retorna um objeto `Header` com os campos:
69
+ - `current_host`: Host do ERP no qual o copilot está em execução.
70
+ - `user_email`: Email do usuário autenticado.
71
+ - `jwt_token`: Token JWT do usuário.
72
+ - `jsessionid`: ID de autenticação do ERP.
73
+ - `organization_id`: ID da organização da Bia.
74
+ - `codparc`: Código do parceiro Sankhya.
75
+ - `iam_user_id`: ID do usuário do BIA IAM.
76
+ - `gateway_token`: Token primário do Sankhya API Gateway.
77
+
78
+ - **get_parameter(parameter_name)**
79
+ - Recupera parâmetros sensíveis seguindo a ordem:
80
+ 1. Variáveis de ambiente do sistema
81
+ 2. AWS SSM Parameter Store (fallback)
82
+
83
+ **Observações importantes:**
84
+ - O SSM só é consultado se o parâmetro **não existir** nas variáveis de ambiente.
85
+ - Em produção, a busca no SSM depende do header
86
+ `X-Amzn-Bedrock-AgentCore-Runtime-Custom-prefix`.
87
+ - Se esse header não estiver presente, o método retorna `None`.
88
+
89
+ ---
90
+
91
+ ## **Como utilizar**
92
+
93
+ Nesta seção você encontrará uma breve descrição de como utilizar os principais recursos da biblioteca **Bia Toolkit**.
94
+
95
+ ### **Criando um MCP Server**
96
+
97
+ Primeiro, instale os pacotes **MCP** e **Bia Toolkit**.
98
+
99
+ ```bash
100
+ pip install mcp biatoolkit
101
+ ```
102
+
103
+ Crie um novo arquivo chamado `meu_mcp_server.py` com o seguinte conteúdo:
104
+
105
+ ```python
106
+ from mcp.server.fastmcp import FastMCP
107
+ import json
108
+
109
+ mcp = FastMCP(host="0.0.0.0", stateless_http=True)
110
+
111
+ @mcp.tool()
112
+ def listar() -> str:
113
+ """Retorna uma lista de exemplo"""
114
+ exemplo = {
115
+ "itens": [
116
+ {"id": 1, "nome": "Item 1"},
117
+ {"id": 2, "nome": "Item 2"},
118
+ {"id": 3, "nome": "Item 3"},
119
+ ]
120
+ }
121
+ return json.dumps(exemplo, indent=4, sort_keys=True)
122
+
123
+ @mcp.tool()
124
+ def adicionar(id: int, nome: str) -> str:
125
+ """Adiciona um item à lista de exemplo"""
126
+ novo_item = {"id": id, "nome": nome}
127
+ return json.dumps(novo_item, indent=4, sort_keys=True)
128
+
129
+ if __name__ == "__main__":
130
+ mcp.run(transport="streamable-http")
131
+ ```
132
+
133
+ #### **Entendendo o código**
134
+
135
+ - **FastMCP**: Cria um servidor MCP que pode hospedar suas ferramentas.
136
+ - **@mcp.tool()**: Decorador que transforma suas funções Python em ferramentas MCP.
137
+ - **Tool**: Duas ferramentas simples que demonstram diferentes tipos de operação.
138
+
139
+ ⚠️ **IMPORTANTE**: Para fazer o deploy no ambiente do Bia Agent Builder, o nome do arquivo, que neste exemplo é `meu_mcp_server.py`, será utilizado para gerar um `pacote Python`. Este pacote deverá ser `único` no Bia Agent Builder. Portanto, no deploy, caso este pacote `já exista` no Bia Agent Builder, você precisará renomear o seu arquivo.
140
+
141
+ #### **Iniciando o servidor localmente**
142
+
143
+ Para executar o seu servidor localmente:
144
+
145
+ ```bash
146
+ python meu_mcp_server.py
147
+ ```
148
+
149
+ Você deverá receber uma mensagem no console semelhante à imagem a seguir:
150
+
151
+ ![Figura 01 - Servidor MCP executando localmente](https://iili.io/fSAyNRI.png)
152
+
153
+ #### **Como testar o servidor local**
154
+
155
+ Crie um novo arquivo chamado `local.py` com o seguinte conteúdo:
156
+
157
+ ```python
158
+ import asyncio
159
+ from biatoolkit.basic_client import BiaClient
160
+
161
+ MCP_SERVER_URL = "http://0.0.0.0:8000/mcp"
162
+ client = BiaClient(MCP_SERVER_URL)
163
+
164
+ async def list_tools():
165
+ tools = await client.list_tools()
166
+ for tool in tools.tools:
167
+ print(f"Tool: {tool.name}, Description: {tool.description}")
168
+
169
+ async def call_tool(tool_name: str, params: dict = None):
170
+ result = await client.call_tool(tool_name, params)
171
+ print(result.content[0].text)
172
+
173
+ async def main():
174
+ await list_tools()
175
+
176
+ asyncio.run(main())
177
+ ```
178
+
179
+ #### **Entendendo o código**
180
+
181
+ - **BiaClient**: É uma classe da biblioteca **Bia Toolkit** que encapsula um cliente HTTP para comunicação com servidores MCP.
182
+ - **list_tools**: Executa a instrução `client.list_tools()` para recuperar todas as ferramentas disponíveis no servidor MCP.
183
+ - **call_tool**: Executa a instrução `client.call_tool(tool_name, params)` para executar uma ferramenta específica do servidor MCP.
184
+
185
+ #### **Executando o código**
186
+
187
+ ⚠️ Certifique-se de que o servidor MCP `meu_mcp_server.py` ainda esteja em execução.
188
+
189
+ Execute o arquivo `local.py` em outro terminal:
190
+
191
+ ```bash
192
+ python local.py
193
+ ```
194
+
195
+ Você deverá ver a saída no console semelhante a:
196
+
197
+ ![Figura 02 - Cliente MCP listando tools do servidor](https://iili.io/fS7lELN.png)
198
+
199
+ Caso deseje testar a execução de uma **tool**, basta alterar o método `main` conforme a seguir:
200
+
201
+ ```python
202
+ async def main():
203
+ await call_tool("adicionar", {"id": 4, "nome": "Novo item"})
204
+ ```
205
+
206
+ Veja que o método `call_tool` possui dois parâmetros:
207
+
208
+ - O primeiro é o nome da tool que queremos executar.
209
+ - O segundo é um `dicionário` com os parâmetros da tool, sendo o segundo __(opcional)__ caso exista.
210
+
211
+ Ao executar o arquivo `local.py`, você deverá ver a saída no console semelhante a:
212
+
213
+ ![Figura 03 - Cliente MCP executando uma tool do servidor](https://iili.io/fS7l1Xp.png)
214
+
215
+ ### **Enviando parâmetros via header**
216
+
217
+ Se seu servidor MCP estiver sendo executado **localmente**, você conseguirá informar qualquer parâmetro no `header` da requisição. Entretanto, quando o seu servidor MCP estiver hospedado no ambiente de produção do **Bia Agent Builder** (AWS Bedrock AgentCore), apenas os parâmetros abaixo podem ser utilizados.
218
+
219
+ ⚠️ QUALQUER OUTRO PARÂMETRO SERÁ IGNORADO PELO SERVIDOR. ⚠️
220
+
221
+ - **X-Amzn-Bedrock-AgentCore-Runtime-Custom-current-host**: Host do ERP no qual o copilot está em execução.
222
+ - **X-Amzn-Bedrock-AgentCore-Runtime-Custom-user-email**: Email do usuário autenticado.
223
+ - **X-Amzn-Bedrock-AgentCore-Runtime-Custom-jwt-token**: JWT token do usuário -> SankhyaID, SankhyaPass ou Token interno Bia.
224
+ - **X-Amzn-Bedrock-AgentCore-Runtime-Custom-jsessionid**: ID de autenticação do ERP.
225
+ - **X-Amzn-Bedrock-AgentCore-Runtime-Custom-organization-id**: ID da organização da Bia.
226
+ - **X-Amzn-Bedrock-AgentCore-Runtime-Custom-codparc**: Código do parceiro (parceiro Sankhya).
227
+ - **X-Amzn-Bedrock-AgentCore-Runtime-Custom-iam-user-id**: ID do usuário do BIA IAM.
228
+ - **X-Amzn-Bedrock-AgentCore-Runtime-Custom-gateway-token**: Token primário do Sankhya API Gateway.
229
+
230
+ ```python
231
+ import asyncio
232
+ from biatoolkit.basic_client import BiaClient
233
+
234
+ MCP_SERVER_URL = "http://0.0.0.0:8000/mcp"
235
+
236
+ # Se seu servidor MCP estiver sendo executado **localmente**, você conseguirá informar qualquer parâmetro
237
+ # no `header` da requisição. Entretanto, quando o seu servidor MCP estiver hospedado no ambiente de produção
238
+ # do Bia Agent Builder (AWS Bedrock AgentCore), apenas os parâmetros abaixo podem ser utilizados.
239
+
240
+ # Ao utilizar os serviços de interação com a Bia (/agent/stream, /agent/message ou /agent/invoke),
241
+ # os parâmetros abaixo já são automaticamente preenchidos e enviados pelos serviços.
242
+ headers = {
243
+ "X-Amzn-Bedrock-AgentCore-Runtime-Custom-current-host": "current-host-123456", # Host do ERP no qual o copilot está em execução.
244
+ "X-Amzn-Bedrock-AgentCore-Runtime-Custom-user-email": "user-email-123456", # Email do usuário autenticado.
245
+ "X-Amzn-Bedrock-AgentCore-Runtime-Custom-jwt-token": "jwt-token-123456", # JWT token do usuário -> SankhyaID, SankhyaPass ou Token interno Bia.
246
+ "X-Amzn-Bedrock-AgentCore-Runtime-Custom-jsessionid": "jsessionid-123456", # ID de autenticação do ERP.
247
+ "X-Amzn-Bedrock-AgentCore-Runtime-Custom-organization-id": "123", # ID da organização da Bia.
248
+ "X-Amzn-Bedrock-AgentCore-Runtime-Custom-codparc": "456", # Código do parceiro (parceiro Sankhya).
249
+ "X-Amzn-Bedrock-AgentCore-Runtime-Custom-iam-user-id": "789", # ID do usuário do BIA IAM.
250
+ "X-Amzn-Bedrock-AgentCore-Runtime-Custom-gateway-token": "gateway-token-123456", # Token primário do Sankhya API Gateway.
251
+ "Content-Type": "application/json"
252
+ }
253
+
254
+ client = BiaClient(MCP_SERVER_URL, headers=headers)
255
+
256
+ async def list_tools() -> None:
257
+ tools = await client.list_tools()
258
+ for tool in tools.tools:
259
+ print(f"Tool: {tool.name}, Description: {tool.description}")
260
+
261
+
262
+ async def call_tool(tool_name: str, params: dict = None) -> None:
263
+ result = await client.call_tool(tool_name, params)
264
+ print(result.content[0].text)
265
+
266
+
267
+ async def main():
268
+ await call_tool("listar")
269
+
270
+
271
+ asyncio.run(main())
272
+ ```
273
+
274
+ ...existing code...
275
+
276
+ Para recuperar os parâmetros no MCP Server que foram enviados por meio do `header` da requisição, basta utilizar a classe `BiaUtil` conforme a seguir:
277
+
278
+ ```python
279
+ from mcp.server.fastmcp import FastMCP
280
+ from biatoolkit.util import BiaUtil
281
+
282
+ mcp = FastMCP(host="0.0.0.0", stateless_http=True)
283
+
284
+ @mcp.tool()
285
+ def processar() -> str:
286
+ """Executa o processamento de algo"""
287
+
288
+ util = BiaUtil(mcp)
289
+ header = util.get_header()
290
+
291
+ # Exemplo de uso dos parâmetros do header. Utilize conforme a necessidade
292
+ # do seu processamento, como autenticação de endpoints, identificação, etc.
293
+
294
+ print("Valor do parâmetro current_host:", header.current_host)
295
+ print("Valor do parâmetro user_email:", header.user_email)
296
+ print("Valor do parâmetro jwt_token:", header.jwt_token)
297
+ print("Valor do parâmetro jsessionid:", header.jsessionid)
298
+ print("Valor do parâmetro organization_id:", header.organization_id)
299
+ print("Valor do parâmetro codparc:", header.codparc)
300
+ print("Valor do parâmetro iam_user_id:", header.iam_user_id)
301
+ print("Valor do parâmetro gateway_token:", header.gateway_token)
302
+
303
+ return f"Processamento executado"
304
+
305
+
306
+ if __name__ == "__main__":
307
+ mcp.run(transport="streamable-http")
308
+ ```
309
+
310
+ ### **Recuperando parâmetros do cofre de segredos**
311
+
312
+ Você pode utilizar parâmetros sensíveis de duas formas:
313
+
314
+ - Usando arquivos `.env` para execução local.
315
+ - Usando o cofre de segredos do Bia Agent Builder para execução em ambiente produtivo.
316
+ - Você pode adicionar parâmetros sensíveis no cofre de segredos do Bia Agent Builder. Para adicionar, alterar e excluir os parâmetros do cofre, utilize as funcionalidades da Plataforma Bia Agent Builder UI.
317
+
318
+ Para recuperar um valor sensível no seu MCP Server, utilize o método `get_parameter(parameter_name: str)` da classe `BiaUtil`.
319
+
320
+ ```python
321
+ from mcp.server.fastmcp import FastMCP
322
+ from biatoolkit.util import BiaUtil
323
+
324
+ mcp = FastMCP(host="0.0.0.0", stateless_http=True)
325
+
326
+ @mcp.tool()
327
+ def processar() -> str:
328
+ """Executa o processamento de algo"""
329
+
330
+ util = BiaUtil(mcp)
331
+ valor = util.get_parameter("meu_parametro")
332
+
333
+ # Exemplo de uso do parâmetro recuperado. Utilize conforme a necessidade
334
+ # do seu processamento, como autenticação de endpoints, identificação, etc.
335
+
336
+ print("Valor do parâmetro:", valor)
337
+ return f"Processamento executado"
338
+
339
+
340
+ if __name__ == "__main__":
341
+ mcp.run(transport="streamable-http")
342
+ ```
343
+
344
+ O método `get_parameter(parameter_name: str)` busca o parâmetro informado em duas fontes distintas. Primeiro, o método tenta buscar o parâmetro consultando as **variáveis de ambiente** do sistema. Caso não exista, o método tenta buscar o parâmetro na **AWS SSM Parameter Store**.
345
+
346
+ ✅ Isso é vantajoso pois você pode armazenar o parâmetro em:
347
+
348
+ - Um arquivo `.env` para testes locais.
349
+ - No cofre de segredos do Bia Agent Builder para usar em ambiente produtivo.
350
+
351
+
352
+ ---
353
+
354
+ ## Validação e Coerção de Dados
355
+
356
+ O Bia Toolkit oferece funções utilitárias para normalização, sanitização e coerção de dados, facilitando o consumo seguro de entradas vindas de APIs, headers, payloads e integrações legadas.
357
+
358
+
359
+ ### Validação de Dados (`biatoolkit.validation.validation`)
360
+
361
+ Utilize a classe **BiaValidation** para acessar as funções de validação de forma padronizada:
362
+
363
+ - **BiaValidation.parse_int_list(value, dedupe=True, keep_order=True)**
364
+ - Normaliza um valor arbitrário em uma lista de inteiros.
365
+ - Suporta: None, int, str (extrai números), list/tuple (recursivo).
366
+ - Ignora valores inválidos.
367
+ - Deduplica e mantém ordem por padrão.
368
+ - Exemplo:
369
+ ```python
370
+ from biatoolkit.validation.validation import BiaValidation
371
+ BiaValidation.parse_int_list("SKU=300231 x2") # [300231, 2]
372
+ BiaValidation.parse_int_list([1, 2, 1, 3], dedupe=False) # [1, 2, 1, 3]
373
+ ```
374
+
375
+ - **BiaValidation.sanitize_like(value, max_len=80, upper=True)**
376
+ - Sanitiza texto para uso seguro em filtros LIKE/search SQL.
377
+ - Remove caracteres fora da allowlist, limita tamanho, escapa aspas simples, %, _ e normaliza espaços.
378
+ - Converte para maiúsculas por padrão.
379
+ - Exemplo:
380
+ ```python
381
+ from biatoolkit.validation.validation import BiaValidation
382
+ BiaValidation.sanitize_like("O'Reilly") # "O''REILLY"
383
+ BiaValidation.sanitize_like("100%_OK") # "100\\%\\_OK"
384
+ ```
385
+
386
+
387
+ ### Coerção de Dados (`biatoolkit.validation.coercion`)
388
+
389
+ Utilize a classe **BiaCoercion** para acessar as funções de coerção de forma padronizada:
390
+
391
+ - **BiaCoercion.ensure_list(value)**
392
+ - Garante que o valor seja retornado como lista.
393
+ - None → [], list → list, tuple/set → list, dict → [dict], outro → [valor].
394
+ - Exemplo:
395
+ ```python
396
+ from biatoolkit.validation.coercion import BiaCoercion
397
+ BiaCoercion.ensure_list(None) # []
398
+ BiaCoercion.ensure_list({"a": 1}) # [{"a": 1}]
399
+ BiaCoercion.ensure_list(5) # [5]
400
+ ```
401
+
402
+ - **BiaCoercion.unwrap_dollar_value(value)**
403
+ - Desembrulha valores no formato {"$": ...} (comum em integrações legadas).
404
+ - Exemplo:
405
+ ```python
406
+ from biatoolkit.validation.coercion import BiaCoercion
407
+ BiaCoercion.unwrap_dollar_value({"$": 123}) # 123
408
+ BiaCoercion.unwrap_dollar_value("abc") # "abc"
409
+ ```
410
+
411
+ - **BiaCoercion.to_int(value, default=0)**
412
+ - Converte valor para int de forma segura.
413
+ - None, "", bool, NaN/inf → default.
414
+ - Aceita strings numéricas, floats (trunca), etc.
415
+ - Exemplo:
416
+ ```python
417
+ from biatoolkit.validation.coercion import BiaCoercion
418
+ BiaCoercion.to_int(" 42 ") # 42
419
+ BiaCoercion.to_int(None, default=-1) # -1
420
+ ```
421
+
422
+ - **BiaCoercion.to_float(value, default=0.0)**
423
+ - Converte valor para float de forma segura.
424
+ - None, "", bool, NaN/inf → default.
425
+ - Aceita strings com vírgula decimal.
426
+ - Exemplo:
427
+ ```python
428
+ from biatoolkit.validation.coercion import BiaCoercion
429
+ BiaCoercion.to_float("12,34") # 12.34
430
+ BiaCoercion.to_float("abc", default=-1.0) # -1.0
431
+ ```
432
+
433
+
434
+ Essas funções são úteis para garantir robustez e previsibilidade ao tratar dados vindos de múltiplas fontes, reduzindo erros e if/else espalhados pelo código.
435
+
436
+ ---
437
+
438
+ ## Integração com Sankhya (`biatoolkit.sankhya_call`)
439
+
440
+
441
+ O Bia Toolkit oferece integração pronta para consumo de serviços HTTP da plataforma Sankhya (ou gateway), com autenticação via JSESSIONID e configuração de timeouts/retries via variáveis de ambiente.
442
+
443
+ ### Objetivo
444
+
445
+ - Facilitar chamadas autenticadas a serviços Sankhya sem que o desenvolvedor precise lidar com autenticação, headers ou gerenciamento de sessão HTTP.
446
+ - Fornecer métodos prontos para chamadas genéricas (`call_json`) e para consultas a views (`load_view`).
447
+ - Permitir uso estático compatível com scaffolds legados via `Sankhya.Call(...)`.
448
+
449
+ ### Configuração
450
+
451
+ - O caminho do serviço (`/mge/service.sbr`) é fixo no toolkit.
452
+ - O parâmetro `base_url` é obrigatório e pode ser passado explicitamente ou extraído automaticamente do header do runtime (`current_host` via `BiaUtil`).
453
+ - Não existe mais configuração via variável de ambiente para base_url ou service_path.
454
+ - As variáveis de ambiente opcionais são apenas para timeout, retries e SSL:
455
+ - `SANKHYA_TIMEOUT_CONNECT`: timeout de conexão (default: 3.05)
456
+ - `SANKHYA_TIMEOUT_READ`: timeout de leitura (default: 12)
457
+ - `SANKHYA_RETRIES_TOTAL`: número de tentativas em falha (default: 3)
458
+ - `SANKHYA_RETRY_BACKOFF`: backoff entre tentativas (default: 0.5)
459
+ - `SANKHYA_VERIFY_SSL`: se valida SSL (default: "1")
460
+
461
+ ### Principais classes e métodos
462
+
463
+ - **SankhyaSettings**: Dataclass de configuração de timeouts/retries/SSL. Use `SankhyaSettings.from_env()` para obter as configurações do ambiente.
464
+ - **Sankhya**: Classe principal de integração. Permite instanciar com contexto MCP (`FastMCP`) ou usar métodos estáticos.
465
+ - `call_json(...)`: Realiza chamada HTTP autenticada, retorna JSON.
466
+ - `load_view(...)`: Helper para consultas a views Sankhya (`CRUDServiceProvider.loadView`).
467
+ - `Call(...)`: Método estático compatível com scaffolds legados.
468
+ - **SankhyaHTTPError**: Exceção lançada em caso de erro HTTP (status != 200), contendo status_code e response_text.
469
+
470
+ ### Exemplo de uso (instanciado)
471
+
472
+ ```python
473
+ from biatoolkit.sankhya_call import Sankhya
474
+ sk = Sankhya(mcp=mcp)
475
+ result = sk.load_view("BIA_VW_MB_RULES", "CODPROD_A = 123", fields="*")
476
+ # O base_url será extraído automaticamente do header do runtime (current_host)
477
+ ```
478
+
479
+ ### Exemplo de uso (estático)
480
+
481
+ ```python
482
+ from biatoolkit.sankhya_call import Sankhya
483
+ result = Sankhya.Call(jsessionID="...", payload={...}, base_url="https://meu.sankhya.com.br", query="serviceName=...&outputType=json")
484
+ ```
485
+
486
+ ### Observações
487
+
488
+ - O JSESSIONID pode ser passado explicitamente ou extraído automaticamente do header do runtime (se rodando em MCP Server).
489
+ - O método `load_view` facilita consultas a views Sankhya, montando o payload e a querystring automaticamente, e resolve o base_url do header se não for passado.
490
+ - O método `call_json` permite chamadas genéricas a qualquer serviço Sankhya, com controle total sobre headers, método HTTP, payload e querystring, mas exige base_url explícito se não estiver em contexto MCP.
491
+
492
+ ---
@@ -0,0 +1,12 @@
1
+ biatoolkit/__init__.py,sha256=OStl3T8OY7YdGdpKIpwXtTo-IjcQxzDRHzpAoBEM8yU,98
2
+ biatoolkit/basic_client.py,sha256=qp5T85wm6D80i3Owjz9AxUYKmaKHgImxirYCduBi1gk,4760
3
+ biatoolkit/sankhya_call.py,sha256=mL7RZotYRu7sZNEOfsSqPLsE_NEx59Jc-8TWFYqlFtc,15281
4
+ biatoolkit/settings.py,sha256=gA07EMEb9k5tt6ySCOYTV4pKHPSiG7nSap2qhHQhmFY,3494
5
+ biatoolkit/test_sankhya.py,sha256=WmAD9i-I8rk7Bbhq58I6ogENrak-CY-UNdIcD8Hys6I,1473
6
+ biatoolkit/util.py,sha256=PgYKRl85K4wmF4WFrabTQ3yiTmgw9S2BxZ-uvwFnP6A,7768
7
+ biatoolkit/schema/__init__.py,sha256=6lvcENhbQnelI2faBGnEs0yG0k4SkwtIrtmn4PtKWvg,32
8
+ biatoolkit/schema/header.py,sha256=COJPlqK1cFvvWzDcCw2ru1jszWPgyyvabkjzDCc8AjM,683
9
+ biatoolkit-1.2.0.dist-info/METADATA,sha256=T61c3L3zWGBLNA70Rx4dKDa9aKPvTcSTBrBg4dkx39o,19540
10
+ biatoolkit-1.2.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
11
+ biatoolkit-1.2.0.dist-info/top_level.txt,sha256=DyrMS0X6u1FDA9uT854LxoT3X7gzMAlsFQabE-WuKMc,11
12
+ biatoolkit-1.2.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.10.2)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1 @@
1
+ biatoolkit