Guitar
GenerativeAI.h
Go to the documentation of this file.
1 #ifndef GENERATIVEAI_H
2 #define GENERATIVEAI_H
3 
4 #include <string>
5 #include <vector>
6 
7 namespace GenerativeAI {
8 
9 enum class ProviderID {
10  Unknown,
11  OpenAI, // generic OpenAI placeholder
12  OpenAI_responses, // for OpenAI responses API
13  OpenAI_chat_completions, // legacy for OpenAI chat completions API
14  Anthropic,
15  Google,
16  XAI,
17  PFN,
18  Moonshot,
19  Sakura, // さくらの AI Engine(OpenAI chat completions 互換)
20  DeepSeek,
21  OpenRouter,
22  Ollama, // experimental
23  LMStudio, // experimental
24  LLAMACPP, // experimental
25 };
26 
27 template <typename T> class AbstractVisitor {
28 public:
29  virtual ~AbstractVisitor() = default;
30 
31  virtual T case_Unknown() = 0;
32  virtual T case_OpenAI() {return {};} // placeholder
33  virtual T case_OpenAI_responses() = 0;
35  virtual T case_Anthropic() = 0;
36  virtual T case_Google() = 0;
37  virtual T case_XAI() = 0;
38  virtual T case_PFN() = 0;
39  virtual T case_Kimi() = 0;
40  virtual T case_Sakura() = 0;
41  virtual T case_DeepSeek() = 0;
42  virtual T case_OpenRouter() = 0;
43  virtual T case_Ollama() = 0;
44  virtual T case_LMStudio() = 0;
45  virtual T case_LLAMACPP() = 0;
46 
47  T visit(ProviderID provider)
48  {
49  switch (provider) {
50  case ProviderID::Unknown: return case_Unknown();
51  case ProviderID::OpenAI: return case_OpenAI();
55  case ProviderID::Google: return case_Google();
56  case ProviderID::XAI: return case_XAI();
57  case ProviderID::PFN: return case_PFN();
58  case ProviderID::Moonshot: return case_Kimi();
59  case ProviderID::Sakura: return case_Sakura();
60  case ProviderID::DeepSeek: return case_DeepSeek();
62  case ProviderID::Ollama: return case_Ollama();
63  case ProviderID::LMStudio: return case_LMStudio();
64  case ProviderID::LLAMACPP: return case_LLAMACPP();
65  }
66  return case_Unknown();
67  }
68 };
69 
70 struct ProviderInfo {
71  ProviderID id; // 識別ID (整数)
72  std::string tag; // 識別用タグ (小文字、ハイフン区切り)
73  std::string description; // UI表示用説明文
74  std::string env_name; // 環境変数名 (UPPER_SNAKE_CASE_API_KEY)
75 };
76 
78 std::vector<ProviderInfo> const &complete_provider_table();
80 
81 struct Credential {
82  std::string api_key;
83 };
84 
85 class ModelURI {
86 public:
87  std::string string;
88  ModelURI() = default;
89  explicit ModelURI(std::string const &s)
90  : string(s)
91  {
92  }
93 };
94 
95 struct Model {
98  ProviderID api_compatibility__ = ProviderID::Unknown; // 基本的には設定しない。APIを選択できるプロバイダを使用する場合に指定できる。(例: llama.cppでAnthropic APIを使用する場合など)
99  std::string model_name_;
100  std::string host_;
101  int port_ = 80;
104  {}
105  Model(ProviderID provider, const std::string &model_uri);
106  void operator = (std::string const &) = delete;
107 
108  explicit operator bool () const
109  {
111  }
112 
113  void parse_model(std::string const &model_uri);
114  char const *reasoning_effort() const
115  {
116 #if 0
117  return "none";
118  return "low";
119  return "medium";
120  return "high";
121  return "xhigh";
122 #endif
123  return nullptr; // default
124  }
125 
127  {
129  }
130 
132  {
133  return model_uri_;
134  }
135 
136  std::string model_name() const
137  {
138  return model_name_;
139  }
140 
141  std::string host() const
142  {
143  return host_;
144  }
145 
146  int port() const
147  {
148  return port_;
149  }
150 
151  std::string env_name() const
152  {
153  return provider_info_ ? provider_info_->env_name : "";
154  }
155 
157  {
158  ProviderID pid = provider_id();
160  }
161 
162  static Model from_name(std::string const &name);
163  static std::string default_model();
164 };
165 
166 static inline bool operator == (ModelURI const &a, ModelURI const &b)
167 {
168  return a.string == b.string;
169 }
170 
171 struct EndPoint {
172  enum class Type {
173  None,
174  Chat,
175  Models,
176  };
177  std::string url_;
178  std::string suffix_;
179  EndPoint() = default;
180  void operator = (std::string const &url);
181  std::string url_chat() const;
182  std::string url_models() const;
183  std::string url(Type type)
184  {
185  switch (type) {
186  case Type::Chat:
187  return url_chat();
188  case Type::Models:
189  return url_models();
190  }
191  return url_;
192  }
193 };
194 
195 struct Request {
197  std::string model_name;
198  std::vector<std::string> header;
199 };
200 
201 Request make_request(ProviderID provider, Model const &model, Credential const &auth);
202 
203 std::vector<Model> const &ai_model_presets();
204 std::vector<GenerativeAI::ProviderID> const &ai_provider_id_list_for_present_to_users();
205 
206 std::string makeEnvName(GenerativeAI::ModelURI const &model_uri);
207 
208 } // namespace GenerativeAI
209 
210 #endif // GENERATIVEAI_H
Definition: GenerativeAI.h:27
virtual T case_OpenAI()
Definition: GenerativeAI.h:32
virtual T case_OpenAI_chat_completions()=0
T visit(ProviderID provider)
Definition: GenerativeAI.h:47
virtual ~AbstractVisitor()=default
virtual T case_OpenAI_responses()=0
Definition: GenerativeAI.h:85
std::string string
Definition: GenerativeAI.h:87
ModelURI(std::string const &s)
Definition: GenerativeAI.h:89
Definition: GenerativeAI.cpp:8
ProviderID api_compatibility(ProviderID pid)
Definition: GenerativeAI.cpp:48
static bool operator==(ModelURI const &a, ModelURI const &b)
Definition: GenerativeAI.h:166
Request make_request(ProviderID provider, const Model &model, Credential const &cred)
指定されたAIプロバイダ・モデル・認証情報からAPIリクエスト情報を生成する。
Definition: GenerativeAI.cpp:396
ProviderID
Definition: GenerativeAI.h:9
std::vector< ProviderID > const & ai_provider_id_list_for_present_to_users()
ユーザー向けに提示するAIプロバイダIDのリストを返す。
Definition: GenerativeAI.cpp:94
std::string makeEnvName(const ModelURI &model_uri)
モデルURLから環境変数名を生成する。
Definition: GenerativeAI.cpp:415
ProviderInfo const * provider_info(ProviderID id)
AIプロバイダIDに対応するプロバイダ情報を返す。
Definition: GenerativeAI.cpp:203
std::vector< Model > const & ai_model_presets()
ユーザー向けに提示するAIモデルのプリセットリストを返す。
Definition: GenerativeAI.cpp:64
const std::vector< ProviderInfo > & complete_provider_table()
AIプロバイダの完全なマスターテーブルを返す。
Definition: GenerativeAI.cpp:25
Definition: GenerativeAI.h:81
std::string api_key
Definition: GenerativeAI.h:82
Definition: GenerativeAI.h:171
std::string url_models() const
Definition: GenerativeAI.cpp:458
std::string url(Type type)
Definition: GenerativeAI.h:183
std::string url_chat() const
Definition: GenerativeAI.cpp:453
void operator=(std::string const &url)
Definition: GenerativeAI.cpp:434
Type
Definition: GenerativeAI.h:172
std::string url_
Definition: GenerativeAI.h:177
std::string suffix_
Definition: GenerativeAI.h:178
Definition: GenerativeAI.h:95
std::string model_name() const
Definition: GenerativeAI.h:136
ProviderID provider_id() const
Definition: GenerativeAI.h:126
int port() const
Definition: GenerativeAI.h:146
ModelURI model_uri() const
Definition: GenerativeAI.h:131
static Model from_name(std::string const &name)
モデル名の文字列パターンからModelオブジェクトを生成する。
Definition: GenerativeAI.cpp:120
void operator=(std::string const &)=delete
std::string host() const
Definition: GenerativeAI.h:141
char const * reasoning_effort() const
Definition: GenerativeAI.h:114
ProviderInfo const * provider_info_
Definition: GenerativeAI.h:97
ModelURI model_uri_
Definition: GenerativeAI.h:96
int port_
Definition: GenerativeAI.h:101
static std::string default_model()
既定のAIモデル名を返す。
Definition: GenerativeAI.cpp:14
void parse_model(std::string const &model_uri)
モデル名またはURIを解析し、ホスト・ポート・モデル名を設定する。
Definition: GenerativeAI.cpp:156
ProviderID api_compatibility__
Definition: GenerativeAI.h:98
std::string model_name_
Definition: GenerativeAI.h:99
std::string host_
Definition: GenerativeAI.h:100
ProviderID api_compatibility() const
Definition: GenerativeAI.h:156
Model()
Definition: GenerativeAI.h:102
std::string env_name() const
Definition: GenerativeAI.h:151
Definition: GenerativeAI.h:70
ProviderID id
Definition: GenerativeAI.h:71
std::string tag
Definition: GenerativeAI.h:72
std::string env_name
Definition: GenerativeAI.h:74
std::string description
Definition: GenerativeAI.h:73
Definition: GenerativeAI.h:195
EndPoint endpoint
Definition: GenerativeAI.h:196
std::vector< std::string > header
Definition: GenerativeAI.h:198
std::string model_name
Definition: GenerativeAI.h:197