/// <summary> /// Loads a finetune collection into memory for useage. /// </summary> /// <param name="collectionName">Name of the custom collection to load</param> /// <returns>An object describing the custom collection</returns> public async Task <FinetuneCollection> Load(string collectionName) { // If the collection is already ready, don't re-load. FinetuneCollection collectionInfo = await this.Info(collectionName); if (collectionInfo.LoadStatus == "ready") { return(collectionInfo); } // Kick off load job string jobID = await StartModelLoad(collectionName); while (true) { await Task.Delay(pollDelay); AsyncJobStatus jobStatus = await GetStatus(jobID); if (jobStatus == AsyncJobStatus.Success) { break; } else if (jobStatus == AsyncJobStatus.Failure || jobStatus == AsyncJobStatus.Revoked) { throw new IndicoAPIException("Load Failed"); } } return(await GetResults <FinetuneCollection>(jobID)); }
static async Task Main(string[] args) { const string APIKey = "XXXXXX"; const string APIHost = @"https://api-demo.indico.io"; const string FinetuneModel = "1234_5678_9123456789"; if (args.Length == 0) { Console.WriteLine("Please supply a path to a pdf file or directory."); Environment.Exit(1); } List <string> validFiles = BuildFileList(args); Dictionary <string, string> fileTexts = new Dictionary <string, string>(); if (validFiles.Count == 0) { return; } Indico sdk = new Indico(APIKey, APIHost); // Extract the contents of each file and write to a txt file. // Build a list of extraction tasks IEnumerable <Task <Tuple <string, string> > > extractTasksQuery = from filePath in validFiles select ExtractDocument(filePath, sdk); // Kick off all the tasks in the list List <Task <Tuple <string, string> > > extractTasks = extractTasksQuery.ToList(); while (extractTasks.Count > 0) { Task <Tuple <string, string> > firstFinishedTask = await Task.WhenAny(extractTasks); Tuple <string, string> extractResult = await firstFinishedTask; extractTasks.Remove(firstFinishedTask); // Skip any failed documents if (extractResult.Item2 != null) { fileTexts.Add(extractResult.Item1, extractResult.Item2); } } // Load Finetune model try { Console.WriteLine("Loading Model..."); FinetuneCollection collection = await sdk.finetune.Load(FinetuneModel); Console.WriteLine("Model Loaded: {0}", JsonConvert.SerializeObject(collection, Formatting.Indented)); } catch (IndicoAPIException iae) { Console.WriteLine("Error loading model for predictions. {0}", iae.Message); return; } try { // Get Finetune Extraction Predictions List <List <FinetuneExtraction> > allExtractions = await sdk.finetune.PredictAnnotation(FinetuneModel, fileTexts.Values.ToArray()); int extractionCount = 0; string[] extractedFilenames = fileTexts.Keys.ToArray(); StringBuilder sb = new StringBuilder(); for (var i = 0; i < allExtractions.Count; i++) { string fileName = Path.GetFileName(extractedFilenames[i]); foreach (FinetuneExtraction extraction in allExtractions.ElementAt(i)) { string label = extraction.Label; sb.Append(fileName + ","); sb.Append(FormatCSVCell(extraction.Text) + ","); sb.Append(label + ","); sb.Append(extraction.Confidence[label]); sb.AppendLine(); extractionCount++; } } // Write Results to file string outputPath = Path.Combine(Directory.GetCurrentDirectory(), "output.csv"); File.WriteAllText(outputPath, sb.ToString()); Console.WriteLine("Finetune Extractions complete. {0} extractions found. Report is available here: {1}", extractionCount, outputPath); } catch (IndicoAPIException iae) { Console.WriteLine("Error getting predictions for documents. {0}", iae.Message); return; } catch (IOException ioe) { Console.WriteLine("Error writing predicitons report. {0}", ioe.Message); } }