# Chalk Elixir
[](https://github.com/chalk-ai/chalk-elixir/actions/workflows/dialyxir.yaml)
[](https://github.com/chalk-ai/chalk-elixir/actions/workflows/integration-test.yaml)
[](https://github.com/chalk-ai/chalk-elixir/actions/workflows/publish.yaml)
[](https://hex.pm/packages/chalk_elixir)
[](https://hexdocs.pm/chalk_elixir/)
[](https://hex.pm/packages/chalk_elixir)
[](https://hex.pm/packages/chalk_elixir)
<p align="center">
  <img src="assets/chalk-logo.png" alt="Chalk Logo" width="150" />
</p>
Official Elixir client for [Chalk](https://chalk.ai) Online Queries. This library provides an easy way to integrate with Chalk's API for feature computation and serving.
## Installation
Add `chalk_elixir` to your list of dependencies in `mix.exs`:
```elixir
def deps do
  [
    {:chalk_elixir, "~> 0.0.12"}
  ]
end
```
## Usage
### Basic Query
Online queries are executed by calling `Chalk.Query.online/2` and passing inputs and expected outputs as described in the [Chalk API documentation](https://docs.chalk.ai/docs/query-basics).
```elixir
{:ok, response} = Chalk.Query.online(%{
  inputs: %{
    "user.id": 1
  },
  outputs: [
    "user.id",
    "user.email",
    "user.credit_score"
  ]
})
```
### Advanced Options
The query can include additional options:
```elixir
{:ok, response} = Chalk.Query.online(%{
  inputs: %{
    "user.id": 1
  },
  outputs: [
    "user.id",
    "user.email",
    "user.credit_score"
  ],
  staleness: %{
    "user.credit_score": "1d" # Allow data up to 1 day old
  },
  context: %{
    environment: "production",
    tags: ["high-priority"]
  },
  query_name: "user_profile_query" # For telemetry and observability
})
```
### Response Structure
The response contains data, errors, and metadata:
```elixir
%Chalk.Query.OnlineQueryResponse{
  data: [
    %Chalk.Query.FeatureResult{
      field: "user.id",
      value: 1,
      meta: %Chalk.Query.FeatureMeta{...}
    },
    %Chalk.Query.FeatureResult{
      field: "user.email",
      value: "user@example.com",
      meta: %Chalk.Query.FeatureMeta{...}
    },
    ...
  ],
  errors: [...],
  meta: %Chalk.Query.QueryMeta{...}
}
```
## Authentication
The Chalk client supports two authentication methods:
### Environment Variables
Set the following environment variables:
```
CHALK_CLIENT_ID=your_client_id
CHALK_CLIENT_SECRET=your_client_secret
```
Optionally, you can set a default deployment:
```
DEPLOYMENT_ID=your_deployment_id
```
### Explicit Credentials
Pass credentials directly to the client:
```elixir
Chalk.Query.online(
  %{
    inputs: %{
      "user.id": 1
    },
    outputs: [
      "user.id"
    ]
  },
  %{    
    client_id: "your_client_id",
    secret: "your_client_secret",
    deployment_id: "your_deployment_id" # Optional
  }
)
```
Credentials can be generated on the [Chalk dashboard](https://console.chalk.ai) or [via API](https://docs.chalk.ai/docs/online-authentication#fetching-an-access-token).
## Documentation
For detailed documentation, visit:
- [Hex docs](https://hexdocs.pm/chalk_elixir/)
- [Chalk API documentation](https://docs.chalk.ai/docs/query-basics)
## Development
### Running Tests
```bash
mix test
```
### Linting
```bash
mix dialyzer
mix credo
```
## License
This project is licensed under the Apache 2.0 License - see the [LICENSE](LICENSE) file for details.