call method

Future<String> call({
  1. bool encode = false,
})

Calls the Pollinations API to generate text based on the provided prompt.

@param encode Whether to encode the response. Default is false. @return A Future that resolves to a string with the generated text or an error message.

Implementation

Future<String> call({bool encode = false}) async {
  try {
    if (contextual || (images != null && images!.isNotEmpty)) {
      List<Map<String, dynamic>> formattedMessages =
          messages?.map((message) {
            return message.call();
          }).toList() ??
          [];

      if (system.isNotEmpty &&
          (formattedMessages.isEmpty ||
              formattedMessages.first['role'] !=
                  EnumToString.convertToString(Role.system))) {
        formattedMessages.insert(
          0,
          Message(role: Role.system, content: system).call(),
        );
      }

      if (prompt.isNotEmpty) {
        if (images != null && images!.isNotEmpty) {
          // Ensure images are correctly formatted in the messages
          formattedMessages.add(
            Message(role: Role.user, content: prompt, images: images).call(),
          );
        } else {
          formattedMessages.add(
            Message(role: Role.user, content: prompt).call(),
          );
        }
      }

      final response = await http
          .post(
            Uri.parse("https://${ApiConfig.getEndpoint(Api.text)}/"),
            headers: ApiConfig.headers,
            body: json.encode({
              "model": model,
              "messages": formattedMessages,
              "seed": seed.toString(),
              "private": private.toString(),
              "reasoning_effort": reasoningEffort,
              "json": jsonMode.toString(),
              "referrer": referrer,
            }),
          )
          .timeout(Duration(seconds: ApiConfig.timeout));

      if (response.statusCode == 200) {
        if (jsonMode) {
          try {
            return json.decode(response.body);
          } catch (e) {
            return response.body;
          }
        } else {
          return response.body;
        }
      } else {
        return "An error occurred: ${response.statusCode} - ${response.body}";
      }
    } else {
      final params = {
        "model": model,
        "seed": seed.toString(),
        "private": private.toString(),
        "reasoning_effort": reasoningEffort,
        "json": jsonMode.toString(),
        "referrer": referrer,
      };
      if (system.isNotEmpty) {
        params["system"] = system;
      }

      final uri = Uri.parse(
        "https://${ApiConfig.getEndpoint(Api.text)}/$prompt",
      ).replace(queryParameters: params);
      final response = await http
          .get(uri, headers: ApiConfig.headers)
          .timeout(Duration(seconds: ApiConfig.timeout));

      if (response.statusCode == 200) {
        if (jsonMode) {
          try {
            return json.decode(response.body);
          } catch (e) {
            return response.body;
          }
        } else {
          return response.body;
        }
      } else {
        return "An error occurred: ${response.statusCode} - ${response.body}";
      }
    }
  } catch (e) {
    return "An error occurred: $e";
  }
}