Claudio Banner

๐Ÿ‡ฌ๐Ÿ‡ง English ยท ๐Ÿ‡ฎ๐Ÿ‡ฉ Bahasa Indonesia

claudio

Multi-provider AI SDK for Dart/Flutter โ€” one interface, many providers.

pub package License: MIT

Install

Dart / Flutter

dependencies:
  claudio_sdk: ^0.1.0

Docker

docker pull ghcr.io/faisalaffan/claudio:latest
FROM ghcr.io/faisalaffan/claudio:latest

COPY . .
RUN dart run main.dart

Quick Start

import 'package:claudio_sdk/claudio_sdk.dart';

void main() async {
  final client = ClaudioClient(
    apiKey: 'sk-ant-your-key',
    provider: Provider.anthropic,
  );

  final msg = await client.messages.create(
    CreateMessageRequest(
      model: 'claude-sonnet-4-20250514',
      maxTokens: 1024,
      messages: [
        MessageParam(role: 'user', content: 'Hello!'),
      ],
    ),
  );

  print(msg.text);
  client.close();
}

Providers

// Anthropic
ClaudioClient(apiKey: 'sk-ant-...', provider: Provider.anthropic);

// DeepSeek (Anthropic-compatible API)
ClaudioClient(apiKey: 'sk-ds-...', provider: Provider.deepseek);

// Auto-detect from environment
ClaudioClient.fromEnvironment();

Features

  • Messages API โ€” create() and createStream() with SSE
  • Multi-tools โ€” schema builder for type-safe JSON Schema
  • Extended thinking โ€” enabled, disabled, adaptive
  • Streaming โ€” real-time token & tool input chunks
  • Error handling โ€” typed exception hierarchy (auth, rate limit, network, etc.)
  • Retry โ€” exponential backoff + jitter for 429 and 5xx

Tools & Streaming

final tool = Tool(
  name: 'get_weather',
  description: 'Weather by city.',
  inputSchema: SchemaBuilder().object(
    properties: {
      'city': SchemaProperty.string(description: 'City name'),
    },
    required: ['city'],
  ).build(),
);

final stream = client.messages.createStream(
  CreateMessageRequest(
    model: 'claude-sonnet-4-20250514',
    maxTokens: 1024,
    messages: [MessageParam(role: 'user', content: 'Weather in Jakarta?')],
    tools: [tool],
  ),
);

await for (final event in stream) {
  if (event is ContentBlockDeltaEvent) {
    switch (event.delta) {
      case TextDelta(:final text): stdout.write(text);
      case InputJsonDelta(:final partialJson): print(partialJson);
    }
  }
}

Error Handling

try {
  final msg = await client.messages.create(request);
} on AuthenticationException catch (e) {
  print('Auth error: ${e.message}');
} on RateLimitException catch (e) {
  print('Rate limited, retry after ${e.retryAfter}');
} on ApiException catch (e) {
  print('Server error ${e.statusCode}: ${e.message}');
} on NetworkException catch (e) {
  print('Network: ${e.message}');
}

If you find this project useful, consider supporting its development:

GitHub Sponsors Ko-fi Saweria

License

MIT


Claudio

Libraries

claudio_sdk
claudio โ€” Multi-provider AI SDK for Dart/Flutter.