-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathlist_models.cpp
More file actions
122 lines (101 loc) · 3.76 KB
/
list_models.cpp
File metadata and controls
122 lines (101 loc) · 3.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// Copyright (c) 2025 Elias Bachaalany
// SPDX-License-Identifier: MIT
/// @file list_models.cpp
/// @brief Example demonstrating model discovery and vision capabilities
///
/// This example shows how to:
/// 1. Enumerate available models via client.list_models()
/// 2. Inspect model capabilities (vision support, context window)
/// 3. Display ModelVisionLimits (supported media types, image limits)
#include <copilot/copilot.hpp>
#include <iomanip>
#include <iostream>
#include <string>
int main()
{
try
{
copilot::ClientOptions options;
options.log_level = copilot::LogLevel::Info;
copilot::Client client(options);
std::cout << "=== List Models Example ===\n\n";
std::cout << "Discovering available models and their capabilities...\n\n";
client.start().get();
// Fetch the list of available models
auto models = client.list_models().get();
std::cout << "Found " << models.size() << " model(s):\n\n";
for (size_t i = 0; i < models.size(); i++)
{
const auto& model = models[i];
std::cout << " " << (i + 1) << ". " << model.name
<< " [" << model.id << "]\n";
// Context window
std::cout << " Context window: "
<< model.capabilities.limits.max_context_window_tokens
<< " tokens\n";
if (model.capabilities.limits.max_prompt_tokens)
{
std::cout << " Max prompt: "
<< *model.capabilities.limits.max_prompt_tokens
<< " tokens\n";
}
// Vision support
if (model.capabilities.supports.vision)
{
std::cout << " Vision: SUPPORTED\n";
if (model.capabilities.limits.vision)
{
const auto& vision = *model.capabilities.limits.vision;
if (!vision.supported_media_types.empty())
{
std::cout << " Media types: ";
for (size_t j = 0; j < vision.supported_media_types.size(); j++)
{
if (j > 0)
std::cout << ", ";
std::cout << vision.supported_media_types[j];
}
std::cout << "\n";
}
if (vision.max_prompt_images > 0)
{
std::cout << " Max images per prompt: "
<< vision.max_prompt_images << "\n";
}
if (vision.max_prompt_image_size > 0)
{
std::cout << " Max image size: "
<< vision.max_prompt_image_size << " bytes\n";
}
}
}
else
{
std::cout << " Vision: not supported\n";
}
// Policy info
if (model.policy)
{
std::cout << " Policy: " << model.policy->state << "\n";
}
std::cout << "\n";
}
// Summary: count vision-capable models
int vision_count = 0;
for (const auto& m : models)
{
if (m.capabilities.supports.vision)
vision_count++;
}
std::cout << "Summary: " << vision_count << " of " << models.size()
<< " model(s) support vision.\n";
// Cleanup
client.stop().get();
return 0;
}
catch (const std::exception& e)
{
std::cerr << "Error: " << e.what() << "\n";
return 1;
}
}