turn method

Future<SyniTurnResult> turn(
  1. SyniTurnRequest request, {
  2. SyniExecutionMode mode = SyniExecutionMode.localOnly,
})

Run an authority-aware Runtime API 2.0 turn on device.

Cloud V2 routing is intentionally not emulated by flattening policy, history, and task fields into one string. Until the cloud endpoint accepts the same contract this method is local-only; existing chat remains the compatible hybrid/cloud API.

Implementation

Future<SyniTurnResult> turn(
  SyniTurnRequest request, {
  SyniExecutionMode mode = SyniExecutionMode.localOnly,
}) async {
  if (mode != SyniExecutionMode.localOnly) {
    throw UnsupportedError(
      'SyniAgent.turn currently supports localOnly. Use chat() for the '
      'legacy cloud contract until cloud Runtime API 2.0 is available.',
    );
  }
  final persona = _requirePersona(mode: mode);
  final capabilities = await _runtime.capabilities();
  if (!capabilities.apiVersions.contains('2.0')) {
    throw UnsupportedError(
      'The installed Syni runtime does not support API 2.0.',
    );
  }

  final runtimeRequest = request.toRuntimeRequest(persona);
  final installed = currentState as SyniInstalled;
  final raw = await _runtime.run(
    runtimeRequest,
    preset: _presetForSchema(
      request.task.responseSchemaId ?? persona.responseSchemaId,
    ),
    seed: request.generation.seed ?? 0,
  );
  final provenance = raw.provenance;
  return SyniTurnResult(
    requestId: raw.requestId ?? request.requestId,
    backend: SyniTurnBackend.local,
    apiVersion: raw.apiVersion,
    finishReason: raw.finishReason,
    provenance: provenance == null
        ? null
        : SyniTurnProvenance(
            backend: provenance.backend,
            accelerator: provenance.accelerator,
            runtimeVersion: provenance.runtimeVersion,
            modelId: provenance.modelId,
          ),
    response: SyniChatResponse.fromRuntimeJson(
      raw.rawJson,
      personaId: persona.id,
      runtimeVersion: provenance?.runtimeVersion ?? installed.runtimeVersion,
    ),
  );
}