🇬🇧 English · 🇮🇩 Bahasa Indonesia
Multi-provider AI SDK untuk Dart/Flutter — satu interface, banyak provider.
dependencies:
claudio_sdk: ^0.1.0docker pull ghcr.io/faisalaffan/claudio:latestFROM ghcr.io/faisalaffan/claudio:latest
COPY . .
RUN dart run main.dartimport '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();
}// 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();- Messages API —
create()dancreateStream()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
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);
}
}
}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}');
}Jika proyek ini bermanfaat, dukung pengembangannya:
MIT

