CODEX_ADK/FRONTEND/docs/AGENT_API_INTEGRATION.md
jean-philippe ff34042975 feat: Complete API integration for Agents, Conversations, and Executions
Implement full CQRS API integration with type-safe endpoints for all core backend operations.

## What's New
- **Agent Management**: 4 endpoints (create, get, update, delete) with 3 enums
- **Conversations**: 2 endpoints (create, get) with message support
- **Executions**: 3 endpoints (start, complete, get) with status tracking
- **OpenAPI Schema**: Updated to backend v1.0.0-mvp (10 endpoints)

## Implementation Details
- All endpoints follow CQRS pattern (commands/queries)
- 100% strict typing (no dynamic, all explicit types)
- Functional error handling with Result<T> pattern
- 3,136+ lines of production code
- 1,500+ lines of comprehensive documentation

## Files Added
- lib/api/endpoints/agent_endpoint.dart (364 lines)
- lib/api/endpoints/conversation_endpoint.dart (319 lines)
- lib/api/endpoints/execution_endpoint.dart (434 lines)
- lib/api/examples/agent_example.dart (212 lines)
- docs/AGENT_API_INTEGRATION.md (431 lines)
- docs/COMPLETE_API_INTEGRATION.md (555 lines)
- docs/INTEGRATION_STATUS.md (339 lines)

## Quality Metrics
- Flutter analyze: 0 errors 
- Type safety: 100% (0 dynamic types) 
- CQRS compliance: 100% 
- Backend compatibility: v1.0.0-mvp 

## Backend Integration
- Updated api-schema.json from backend openapi.json
- Supports all MVP endpoints except list operations (deferred to Phase 3)
- Ready for JWT authentication (infrastructure in place)

## Usage
```dart
import 'package:console/api/api.dart';

final client = CqrsApiClient(config: ApiClientConfig.development);

// Agent CRUD
await client.createAgent(CreateAgentCommand(...));
await client.getAgent('uuid');

// Conversations
await client.createConversation(CreateConversationCommand(...));

// Executions
await client.startAgentExecution(StartAgentExecutionCommand(...));
```

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-26 18:53:19 -04:00

432 lines
9.6 KiB
Markdown

# Agent API Integration - Complete Guide
**Status:****READY FOR USE** (Phase 1 Complete)
**Last Updated:** 2025-10-26
**Backend Version:** v1.0.0-mvp
---
## Quick Start
### 1. Import the API Client
```dart
import 'package:console/api/api.dart';
```
### 2. Create an Agent
```dart
final CqrsApiClient client = CqrsApiClient(
config: ApiClientConfig.development,
);
final Result<void> result = await client.createAgent(
CreateAgentCommand(
name: 'Code Generator',
description: 'AI agent for code generation',
type: AgentType.codeGenerator,
modelProvider: 'ollama',
modelName: 'phi',
providerType: ModelProviderType.localEndpoint,
modelEndpoint: 'http://localhost:11434',
systemPrompt: 'You are a code generation assistant',
temperature: 0.7,
maxTokens: 4000,
),
);
result.when(
success: (_) => print('Agent created!'),
error: (error) => print('Error: ${error.message}'),
);
```
### 3. Get Agent Details
```dart
final Result<AgentDto> result = await client.getAgent('agent-uuid');
result.when(
success: (agent) {
print('Name: ${agent.name}');
print('Status: ${agent.status.value}');
print('Model: ${agent.modelProvider}/${agent.modelName}');
},
error: (error) => print('Error: ${error.message}'),
);
```
---
## Available Operations
### Commands (Write Operations)
#### Create Agent
```dart
Future<Result<void>> createAgent(CreateAgentCommand command)
```
**Required Fields:**
- `name` (String) - Display name
- `description` (String) - Purpose and capabilities
- `type` (AgentType) - Agent type enum
- `modelProvider` (String) - e.g., "ollama", "openai", "anthropic"
- `modelName` (String) - e.g., "phi", "gpt-4o", "claude-3.5-sonnet"
- `providerType` (ModelProviderType) - CloudApi, LocalEndpoint, or Custom
- `systemPrompt` (String) - Behavior instructions
**Optional Fields:**
- `modelEndpoint` (String?) - Required for LocalEndpoint
- `apiKey` (String?) - Required for CloudApi (encrypted by backend)
- `temperature` (double) - Default: 0.7, Range: 0.0-2.0
- `maxTokens` (int) - Default: 4000
- `enableMemory` (bool) - Default: true
- `conversationWindowSize` (int) - Default: 10, Range: 1-100
#### Update Agent
```dart
Future<Result<void>> updateAgent(UpdateAgentCommand command)
```
**Required Fields:**
- `id` (String) - Agent UUID
**Optional Fields:** All other fields from CreateAgentCommand plus:
- `status` (AgentStatus?) - Active, Inactive, or Error
**Note:** Only provide fields you want to update. Omit fields to keep existing values.
#### Delete Agent
```dart
Future<Result<void>> deleteAgent(DeleteAgentCommand command)
```
Performs soft-delete (agent not removed from database, just marked as deleted).
### Queries (Read Operations)
#### Get Agent
```dart
Future<Result<AgentDto>> getAgent(String id)
```
Returns full agent details including configuration and timestamps.
---
## Enums Reference
### AgentType
```dart
enum AgentType {
codeGenerator, // 'CodeGenerator'
codeReviewer, // 'CodeReviewer'
debugger, // 'Debugger'
documenter, // 'Documenter'
custom, // 'Custom'
}
```
### AgentStatus
```dart
enum AgentStatus {
active, // 'Active'
inactive, // 'Inactive'
error, // 'Error'
}
```
### ModelProviderType
```dart
enum ModelProviderType {
cloudApi, // 'CloudApi' - OpenAI, Anthropic, etc.
localEndpoint, // 'LocalEndpoint' - Ollama, local models
custom, // 'Custom' - Custom endpoints
}
```
---
## Response Types
### AgentDto
```dart
class AgentDto {
final String id;
final String name;
final String description;
final AgentType type;
final String modelProvider;
final String modelName;
final ModelProviderType providerType;
final String? modelEndpoint;
final double temperature;
final int maxTokens;
final String systemPrompt;
final bool enableMemory;
final int conversationWindowSize;
final AgentStatus status;
final DateTime createdAt;
final DateTime updatedAt;
}
```
---
## Error Handling
### Using when()
```dart
result.when(
success: (agent) {
// Handle success
},
error: (error) {
switch (error.type) {
case ApiErrorType.network:
// No internet connection
case ApiErrorType.timeout:
// Request took too long
case ApiErrorType.http:
if (error.statusCode == 404) {
// Agent not found
} else if (error.statusCode == 401) {
// Unauthorized (JWT missing/invalid)
} else if (error.statusCode == 400) {
// Validation error
}
case ApiErrorType.validation:
// Backend validation failed
case ApiErrorType.serialization:
// JSON parsing error
case ApiErrorType.unknown:
// Unexpected error
}
},
);
```
### Using Switch Expression
```dart
final String message = switch (result) {
ApiSuccess(value: final agent) => 'Success: ${agent.name}',
ApiError(error: final err) when err.statusCode == 404 => 'Agent not found',
ApiError(error: final err) => 'Error: ${err.message}',
};
```
---
## Common Use Cases
### Local Ollama Agent
```dart
await client.createAgent(
CreateAgentCommand(
name: 'Local Code Reviewer',
description: 'Reviews code using local Ollama',
type: AgentType.codeReviewer,
modelProvider: 'ollama',
modelName: 'codellama:7b',
providerType: ModelProviderType.localEndpoint,
modelEndpoint: 'http://localhost:11434',
systemPrompt: 'You are a code review expert.',
temperature: 0.5,
),
);
```
### Cloud API Agent (OpenAI)
```dart
await client.createAgent(
CreateAgentCommand(
name: 'GPT-4 Debugger',
description: 'Advanced debugging with GPT-4',
type: AgentType.debugger,
modelProvider: 'openai',
modelName: 'gpt-4o',
providerType: ModelProviderType.cloudApi,
apiKey: 'sk-...', // Will be encrypted by backend
systemPrompt: 'You are an expert debugger.',
temperature: 0.3,
maxTokens: 8000,
),
);
```
### Update Agent Status
```dart
await client.updateAgent(
UpdateAgentCommand(
id: agentId,
status: AgentStatus.inactive,
),
);
```
### Update Multiple Fields
```dart
await client.updateAgent(
UpdateAgentCommand(
id: agentId,
name: 'Updated Name',
temperature: 0.8,
maxTokens: 6000,
status: AgentStatus.active,
),
);
```
---
## Configuration
### Development (localhost)
```dart
final client = CqrsApiClient(
config: ApiClientConfig.development, // http://localhost:5246
);
```
### Android Emulator
```dart
final client = CqrsApiClient(
config: ApiClientConfig(
baseUrl: 'http://10.0.2.2:5246', // Special emulator IP
timeout: Duration(seconds: 30),
),
);
```
### Production
```dart
final client = CqrsApiClient(
config: ApiClientConfig(
baseUrl: 'https://api.svrnty.com',
timeout: Duration(seconds: 30),
defaultHeaders: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer $jwtToken', // Add JWT when ready
},
),
);
```
---
## Testing
### Run Tests
```bash
flutter test
```
### Analyze Code
```bash
flutter analyze lib/api/endpoints/agent_endpoint.dart
```
### Verify API Connection
```dart
// Check backend health first
final healthResult = await client.checkHealth();
healthResult.when(
success: (isHealthy) => print('Backend ready: $isHealthy'),
error: (error) => print('Backend not reachable: ${error.message}'),
);
```
---
## Files Reference
### Implementation Files
- `lib/api/endpoints/agent_endpoint.dart` - Agent CRUD operations
- `lib/api/api.dart` - Main API export file
- `lib/api/client.dart` - CQRS client implementation
- `lib/api/types.dart` - Core types (Result, errors, pagination)
### Examples
- `lib/api/examples/agent_example.dart` - Complete usage examples
### Backend Contract
- `api-schema.json` - OpenAPI specification (source of truth)
- `../BACKEND/docs/openapi.json` - Backend source (copy to update)
- `../BACKEND/docs/COMPLETE-API-REFERENCE.md` - Full API docs
---
## Important Notes
### Strict Typing
All code follows **strict typing rules** from `CLAUDE.md`:
- ✅ Every variable has explicit type annotation
- ✅ Every function parameter is typed
- ✅ Every function return value is typed
- ❌ No `dynamic` types
- ❌ No untyped `var` declarations
### CQRS Pattern
All endpoints follow CQRS:
- **Commands** return `Result<void>` (no data on success)
- **Queries** return `Result<T>` with typed data
- All requests use **POST** with JSON body (even empty `{}`)
### Functional Error Handling
- ✅ Use `Result<T>` pattern matching
- ✅ Use `when()` or switch expressions
- ❌ Never use try-catch for API calls
### Security
- API keys are **encrypted** by backend (AES-256)
- JWT authentication **not yet implemented** (v2)
- CORS configured for localhost development
---
## Backend Changelog Monitoring
Always check backend changes before updating:
```bash
# View backend changelog
cat ../BACKEND/docs/CHANGELOG.md
# Update API schema when backend changes
cp ../BACKEND/docs/openapi.json ./api-schema.json
# Regenerate if needed (future)
flutter pub run build_runner build --delete-conflicting-outputs
```
---
## Next Steps
### Phase 2 (Coming Soon)
- Conversation endpoints (create, get, list)
- Agent execution endpoints (start, complete, get)
- Real-time execution updates
### Phase 3 (Future)
- JWT authentication integration
- List/pagination endpoints
- Advanced filtering and sorting
---
## Support
- **Questions?** Check `README_API.md` for CQRS architecture
- **Backend Docs:** `../BACKEND/docs/COMPLETE-API-REFERENCE.md`
- **OpenAPI Spec:** `api-schema.json` (source of truth)
- **Examples:** `lib/api/examples/agent_example.dart`
---
**Status:****Production-ready for Agent CRUD operations**
**Last Tested:** 2025-10-26 with backend v1.0.0-mvp