# seritiaymen/tool_calling architecture

> Architecture diagram of the GitHub repository seritiaymen/tool_calling, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-13). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/seritiaymen/tool_calling
- Repository: https://github.com/seritiaymen/tool_calling

## Overview

Tool Calling est une application CLI qui transforme une question en réponse en laissant OpenRouter décider s’il faut consulter l’heure locale ou la météo. `main` configure les composants, puis le service orchestre les appels LLM et l’exécution des outils jusqu’à une réponse ou la limite d’étapes. Le provider valide les réponses et gère les retries; le registre convertit les erreurs d’outils en observations pour le LLM. Les relations ci-dessous s’appuient sur les extraits et le README; les intégrations externes sont représentées séparément.

Main entry points: [`src/main.py`](https://github.com/seritiaymen/tool_calling/blob/main/src/main.py) (Point d’entrée), [`src/providers/openrouter_provider.py`](https://github.com/seritiaymen/tool_calling/blob/main/src/providers/openrouter_provider.py) (Provider OpenRouter), [`src/services/tool_calling_service.py`](https://github.com/seritiaymen/tool_calling/blob/main/src/services/tool_calling_service.py) (Boucle d’outils), [`src/tools/registry.py`](https://github.com/seritiaymen/tool_calling/blob/main/src/tools/registry.py) (Registre et exécution)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["Entrée et configuration"]
  node_main["Point d’entrée<br/>[main.py]"]
  node_settings["Configuration<br/>[config.py]"]
end

subgraph group_conversation["Orchestration conversationnelle"]
  node_service["Boucle d’outils"]
end

subgraph group_llm["Accès au LLM"]
  node_provider["Provider OpenRouter"]
end

subgraph group_tools["Outils métier"]
  node_registry["Registre et exécution<br/>[registry.py]"]
  node_implementations["Heure et météo<br/>[implementations.py]"]
  node_schemas["Schémas d’outils<br/>[schemas.py]"]
end

subgraph group_support["Contrats et observabilité"]
  node_protocols["Contrat provider<br/>[protocols.py]"]
  node_errors["Erreurs LLM<br/>[exceptions.py]"]
  node_logger["Logs JSON<br/>[logger.py]"]
end

node_user(("Utilisateur CLI"))
node_openrouter{{"OpenRouter API"}}
node_weatherapi{{"WeatherAPI"}}

node_user -->|"lance"| node_main
node_main -->|"charge"| node_settings
node_main -->|"instancie"| node_provider
node_main -->|"construit"| node_registry
node_main -->|"fournit"| node_schemas
node_main -->|"configure et appelle"| node_service
node_main -->|"initialise"| node_logger
node_service -->|"appelle LLM"| node_provider
node_provider -->|"requête HTTP"| node_openrouter
node_service -->|"dispatch outil"| node_registry
node_registry -->|"exécute outil"| node_implementations
node_implementations -->|"requête météo"| node_weatherapi
node_provider -->|"lit paramètres"| node_settings
node_main -->|"lit clé météo"| node_settings
node_service -->|"utilise contrat"| node_protocols
node_provider -->|"signale erreurs"| node_errors
node_provider -->|"journalise"| node_logger
node_service -->|"journalise"| node_logger
node_registry -->|"journalise"| node_logger

click node_main "https://github.com/seritiaymen/tool_calling/blob/main/src/main.py"
click node_settings "https://github.com/seritiaymen/tool_calling/blob/main/src/config.py"
click node_service "https://github.com/seritiaymen/tool_calling/blob/main/src/services/tool_calling_service.py"
click node_provider "https://github.com/seritiaymen/tool_calling/blob/main/src/providers/openrouter_provider.py"
click node_registry "https://github.com/seritiaymen/tool_calling/blob/main/src/tools/registry.py"
click node_implementations "https://github.com/seritiaymen/tool_calling/blob/main/src/tools/implementations.py"
click node_schemas "https://github.com/seritiaymen/tool_calling/blob/main/src/tools/schemas.py"
click node_protocols "https://github.com/seritiaymen/tool_calling/blob/main/src/domain/protocols.py"
click node_errors "https://github.com/seritiaymen/tool_calling/blob/main/src/domain/exceptions.py"
click node_logger "https://github.com/seritiaymen/tool_calling/blob/main/src/utils/logger.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_main,node_settings toneBlue
class node_service toneAmber
class node_provider,node_openrouter,node_weatherapi toneMint
class node_registry,node_implementations,node_schemas toneRose
class node_protocols,node_errors,node_logger,node_user toneIndigo
```

## Components

### Entrée et configuration

- [Point d’entrée](https://github.com/seritiaymen/tool_calling/blob/main/src/main.py): `src/main.py`
- [Configuration](https://github.com/seritiaymen/tool_calling/blob/main/src/config.py): `src/config.py`

### Orchestration conversationnelle

- [Boucle d’outils](https://github.com/seritiaymen/tool_calling/blob/main/src/services/tool_calling_service.py): `src/services/tool_calling_service.py`

### Accès au LLM

- [Provider OpenRouter](https://github.com/seritiaymen/tool_calling/blob/main/src/providers/openrouter_provider.py): `src/providers/openrouter_provider.py`

### Outils métier

- [Registre et exécution](https://github.com/seritiaymen/tool_calling/blob/main/src/tools/registry.py): `src/tools/registry.py`
- [Heure et météo](https://github.com/seritiaymen/tool_calling/blob/main/src/tools/implementations.py): `src/tools/implementations.py`
- [Schémas d’outils](https://github.com/seritiaymen/tool_calling/blob/main/src/tools/schemas.py): `src/tools/schemas.py`

### Contrats et observabilité

- [Contrat provider](https://github.com/seritiaymen/tool_calling/blob/main/src/domain/protocols.py): `src/domain/protocols.py`
- [Erreurs LLM](https://github.com/seritiaymen/tool_calling/blob/main/src/domain/exceptions.py): `src/domain/exceptions.py`
- [Logs JSON](https://github.com/seritiaymen/tool_calling/blob/main/src/utils/logger.py): `src/utils/logger.py`

### Other components

- **Utilisateur CLI**
- **OpenRouter API**
- **WeatherAPI**

## Connections

- Utilisateur CLI → Point d’entrée: lance (evidence: `README.md`)
- Point d’entrée → Configuration: charge (evidence: `src/main.py`)
- Point d’entrée → Provider OpenRouter: instancie (evidence: `src/main.py`)
- Point d’entrée → Registre et exécution: construit (evidence: `src/main.py`)
- Point d’entrée → Schémas d’outils: fournit (evidence: `src/main.py`)
- Point d’entrée → Boucle d’outils: configure et appelle (evidence: `src/main.py`)
- Point d’entrée → Logs JSON: initialise (evidence: `src/main.py`)
- Boucle d’outils → Provider OpenRouter: appelle LLM (evidence: `src/services/tool_calling_service.py`)
- Provider OpenRouter → OpenRouter API: requête HTTP (evidence: `src/providers/openrouter_provider.py`)
- Boucle d’outils → Registre et exécution: dispatch outil (evidence: `src/services/tool_calling_service.py`)
- Registre et exécution → Heure et météo: exécute outil (evidence: `src/tools/registry.py`)
- Heure et météo → WeatherAPI: requête météo (evidence: `src/tools/implementations.py`)
- Provider OpenRouter → Configuration: lit paramètres (evidence: `src/providers/openrouter_provider.py`)
- Point d’entrée → Configuration: lit clé météo (evidence: `src/main.py`)
- Boucle d’outils → Contrat provider: utilise contrat (evidence: `src/services/tool_calling_service.py`)
- Provider OpenRouter → Erreurs LLM: signale erreurs (evidence: `src/providers/openrouter_provider.py`)
- Provider OpenRouter → Logs JSON: journalise (evidence: `src/providers/openrouter_provider.py`)
- Boucle d’outils → Logs JSON: journalise (evidence: `src/services/tool_calling_service.py`)
- Registre et exécution → Logs JSON: journalise (evidence: `src/tools/registry.py`)
