Skip to content

Latest commit

 

History

History
151 lines (116 loc) · 3.6 KB

File metadata and controls

151 lines (116 loc) · 3.6 KB

Claudio Banner

🇬🇧 English · 🇮🇩 Bahasa Indonesia

claudio

Multi-provider AI SDK untuk Dart/Flutter — satu interface, banyak provider.

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: 'Halo!'),
      ],
    ),
  );

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

Provider

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

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

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

Fitur

  • Messages APIcreate() dan createStream() dengan SSE
  • Multi-tools — schema builder untuk JSON Schema type-safe
  • Extended thinking — enabled, disabled, adaptive
  • Streaming — real-time token & tool input chunks
  • Error handling — typed exception hierarchy (auth, rate limit, network, dll.)
  • Retry — exponential backoff + jitter untuk 429 dan 5xx

Tool & Streaming

final tool = Tool(
  name: 'get_weather',
  description: 'Cuaca berdasarkan kota.',
  inputSchema: SchemaBuilder().object(
    properties: {
      'city': SchemaProperty.string(description: 'Nama kota'),
    },
    required: ['city'],
  ).build(),
);

final stream = client.messages.createStream(
  CreateMessageRequest(
    model: 'claude-sonnet-4-20250514',
    maxTokens: 1024,
    messages: [MessageParam(role: 'user', content: 'Cuaca di 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}');
}

Sponsor

Jika proyek ini bermanfaat, dukung pengembangannya:

GitHub Sponsors Ko-fi Saweria

Lisensi

MIT


Claudio