Guitar
AiApiBridge.h
Go to the documentation of this file.
1 #ifndef AIAPIBRIDGE_H
2 #define AIAPIBRIDGE_H
3 
4 #include <ai/GenerativeAI.h>
5 
6 #include <string>
7 #include <vector>
8 #include <optional>
9 #include <functional>
10 
11 class AbstractInetClient;
12 
13 /* example for Anthropic Claude responses API
14 
15 {
16  "model": "claude-sonnet-4-6",
17  "id": "msg_01QgGhfNSoB4mDVt55i55LXr",
18  "type": "message",
19  "role": "assistant",
20  "content": [
21  {
22  "type": "text",
23  "text": "Sure! Let me fetch today's quote for you right away!"
24  },
25  {
26  "type": "tool_use",
27  "id": "toolu_01USQo1v4iheZJ4CxkDxV1ku",
28  "name": "get_quote_of_the_day",
29  "input": {},
30  "caller": {
31  "type": "direct"
32  }
33  }
34  ],
35  "stop_reason": "tool_use",
36  "stop_sequence": null,
37  "stop_details": null,
38  "usage": {
39  "input_tokens": 354,
40  "cache_creation_input_tokens": 0,
41  "cache_read_input_tokens": 0,
42  "cache_creation": {
43  "ephemeral_5m_input_tokens": 0,
44  "ephemeral_1h_input_tokens": 0
45  },
46  "output_tokens": 47,
47  "service_tier": "standard",
48  "inference_geo": "global"
49  }
50 }
51 
52 */
53 
54 /* example for OpenAI responses API
55 
56 {
57  "id": "resp_0e4c24cb1691fbd5006a1d80ad01fc819a93ff21b72cd42581",
58  "object": "response",
59  "created_at": 1780318381,
60  "status": "completed",
61  "background": false,
62  "billing": {
63  "payer": "developer"
64  },
65  "completed_at": 1780318381,
66  "error": null,
67  "frequency_penalty": 0.0,
68  "incomplete_details": null,
69  "instructions": null,
70  "max_output_tokens": null,
71  "max_tool_calls": null,
72  "model": "gpt-5.4-mini-2026-03-17",
73  "moderation": null,
74  "output": [
75  {
76  "id": "fc_0e4c24cb1691fbd5006a1d80ad7c20819a9ee90cf849c1a37e",
77  "type": "function_call",
78  "status": "completed",
79  "arguments": "{}",
80  "call_id": "call_L8UWZP0N2eEkgc9F0Z9VjKcZ",
81  "name": "get_quote_of_the_day"
82  }
83  ],
84  "parallel_tool_calls": true,
85  "presence_penalty": 0.0,
86  "previous_response_id": null,
87  "prompt_cache_key": null,
88  "prompt_cache_retention": "in_memory",
89  "reasoning": {
90  "context": "current_turn",
91  "effort": "none",
92  "summary": null
93  },
94  "safety_identifier": null,
95  "service_tier": "default",
96  "store": true,
97  "temperature": 1.0,
98  "text": {
99  "format": {
100  "type": "text"
101  },
102  "verbosity": "medium"
103  },
104  "tool_choice": {
105  "type": "function",
106  "name": "get_quote_of_the_day"
107  },
108  "tools": [
109  {
110  "type": "function",
111  "description": "Get a quote of the day",
112  "name": "get_quote_of_the_day",
113  "parameters": {
114  "additionalProperties": false,
115  "type": "object",
116  "properties": {},
117  "required": []
118  },
119  "strict": true
120  }
121  ],
122  "top_logprobs": 0,
123  "top_p": 0.98,
124  "truncation": "disabled",
125  "usage": {
126  "input_tokens": 48,
127  "input_tokens_details": {
128  "cached_tokens": 0
129  },
130  "output_tokens": 17,
131  "output_tokens_details": {
132  "reasoning_tokens": 0
133  },
134  "total_tokens": 65
135  },
136  "user": null,
137  "metadata": {}
138 }
139 
140 */
141 
142 struct AiResponseEx {
144 
146  std::string type;
147  std::string text;
148  std::string id;
149  std::string name;
150  // std::string input;
151  std::string caller_type;
152  std::string content_json;
153  };
154 
156  std::string id;
157  std::string type;
158  std::string status;
159  std::string arguments;
160  std::string call_id;
161  std::string name;
162  struct Content {
163  std::string text;
164  };
165  std::vector<Content> content;
166  };
167 
169  struct FunctionCall {
170  std::string name;
171  // std::vector<Args> args;
172  std::string id;
173  std::string content_json;
174  std::string text;
176  };
177 
178  struct OpenAiChoice {
179  double index;
180  struct Message {
181  std::string role;
182  std::string content;
183  struct ToolCall {
184  std::string id;
185  std::string type;
186  struct {
187  std::string name;
188  std::string arguments;
189  } function;
190  };
191  std::vector<ToolCall> tool_calls;
193  std::string finish_reason;
194  };
195 
196  std::string model;
197  std::string id;
198  struct {
199  std::string type;
200  std::string role;
201  std::vector<AnthropicContentItem> content;
203  struct {
204  std::string object;
205  std::string status;
206  std::vector<OpenAiOutputItem> output;
207  std::vector<OpenAiChoice> choices;
209  struct {
210  std::vector<GoogleContentItem> content_parts;
212  std::string stop_reason;
213  // std::string stop_sequence;
214  // std::string stop_details;
215  struct Usage {
219  struct CacheCreation {
224  std::string service_tier;
225  std::string inference_geo;
226  } usage;
227  struct Error {
228  std::string type;
229  std::string message;
230  } error;
231 };
232 
234 struct AiResult {
235 
237  {
238  d.ex.api_id = api;
239  }
240 
241  struct Model {
242  std::string id;
243  std::string object;
244  std::string created;
245  std::string owned_by;
246  };
247 
248  struct Models {
249  std::vector<Model> list;
250  };
251 
252  struct Data {
253  bool completed = false;
254  std::string content;
255  std::string error_status;
256  std::string error_message;
257  std::string stop_reason;
259  } d;
260 
261  operator bool () const
262  {
263  return d.completed && d.error_status.empty() && d.error_message.empty();
264  }
265  std::string const &content() const
266  {
267  return d.content;
268  }
269  std::string const &error_status() const
270  {
271  return d.error_status;
272  }
273  std::string const &error_message() const
274  {
275  return d.error_message;
276  }
277 
278  bool is_error() const
279  {
280  return !d.error_status.empty() || !d.error_message.empty();
281  }
282 
283  static AiResult Error(std::string const &stat, std::string const &msg)
284  {
285  AiResult ret;
286  ret.d.completed = false;
287  ret.d.error_status = stat;
288  ret.d.error_message = msg;
289  return ret;
290  }
291 
292 };
293 
294 class AiApiBridge {
295  friend class AiSession;
296 public:
297  struct Query2Request {
299  enum Type {
302  };
304  bool internal = false;
305  std::string prompt_text;
306  std::string prompt_json;
307  void set_text(std::string const &text)
308  {
309  type = TEXT;
310  prompt_text = text;
311  }
312  void set_tooluse(std::string const &json, std::string const &text)
313  {
314  type = JSON;
315  prompt_json = json;
316  prompt_text = text;
317  }
318  Query2Request() = default;
320  : eptype(eptype)
321  {
322  }
323  operator bool () const
324  {
325  return (type == TEXT && !prompt_text.empty()) || (type == JSON && !prompt_json.empty());
326  }
327  };
328 private:
329  struct Private;
332  std::string generate_prompt_json(const GenerativeAI::Model &model, const std::string &prompt, std::string const &system_role = {});
333  AiResult open();
334  AiResult x_request(Query2Request const &req);
335  void close();
336 public:
337  AiApiBridge();
338  ~AiApiBridge();
339 
340  AiResult Error(std::string const &status, std::string const &message) const
341  {
343  ret.d.error_status = status;
344  ret.d.error_message = message;
345  return ret;
346  }
347  GenerativeAI::Model model() const;
349  void set_system_role(std::string const &role);
350  AiResult request(GenerativeAI::EndPoint::Type eptype, std::string const &prompt, const Query2Request &req);
351  AiResult request(const std::string &prompt);
352  std::optional<AiResult::Models> queryModels();
353 };
354 
355 
356 #include <memory>
357 
358 class AiSession {
359 public:
361  std::shared_ptr<AiApiBridge> api_bridge;
363  : api_bridge(std::make_shared<AiApiBridge>())
364  {
365  }
367  {
368  close();
369  }
371  {
372  api_bridge->set_ai_model(model);
373  }
374  bool open()
375  {
376  AiResult result = api_bridge->open();
377  return !result.is_error();
378  }
379  void close()
380  {
381  api_bridge->close();
382  }
384  {
385  return api_bridge->x_request(req);
386  }
387 };
388 
389 #endif // AIAPIBRIDGE_H
Definition: inetclient.h:120
Definition: AiApiBridge.h:294
GenerativeAI::Model model() const
現在設定されているAIモデルを返す。
Definition: AiApiBridge.cpp:672
void close()
Definition: AiApiBridge.cpp:704
AiResult Error(std::string const &status, std::string const &message) const
Definition: AiApiBridge.h:340
Private * m
Definition: AiApiBridge.h:329
AbstractInetClient * http()
Definition: AiApiBridge.cpp:709
AiResult open()
Definition: AiApiBridge.cpp:691
AiApiBridge()
Definition: AiApiBridge.cpp:50
std::optional< AiResult::Models > queryModels()
Definition: AiApiBridge.cpp:892
std::string generate_prompt_json(const GenerativeAI::Model &model, const std::string &prompt, std::string const &system_role={})
プロンプトをプロバイダー固有のAPIリクエストJSON形式に変換する。
Definition: AiApiBridge.cpp:661
~AiApiBridge()
Definition: AiApiBridge.cpp:56
void set_ai_model(GenerativeAI::Model model)
使用するAIモデルを設定する。
Definition: AiApiBridge.cpp:681
void set_system_role(std::string const &role)
Definition: AiApiBridge.cpp:686
AiResult x_request(Query2Request const &req)
Definition: AiApiBridge.cpp:717
AiResult request(GenerativeAI::EndPoint::Type eptype, std::string const &prompt, const Query2Request &req)
指定されたエンドポイントタイプに対してプロンプトを送信し、AIの応答を取得する。
Definition: AiApiBridge.cpp:783
Definition: AiApiBridge.h:358
std::shared_ptr< AiApiBridge > api_bridge
Definition: AiApiBridge.h:361
void set_ai_model(GenerativeAI::Model model)
Definition: AiApiBridge.h:370
void close()
Definition: AiApiBridge.h:379
AiResult request(Quert2Resuest const &req)
Definition: AiApiBridge.h:383
bool open()
Definition: AiApiBridge.h:374
~AiSession()
Definition: AiApiBridge.h:366
AiSession()
Definition: AiApiBridge.h:362
ProviderID
Definition: GenerativeAI.h:9
Definition: GitObjectManager.h:7
Definition: AiApiBridge.cpp:19
Definition: AiApiBridge.h:297
void set_text(std::string const &text)
Definition: AiApiBridge.h:307
void set_tooluse(std::string const &json, std::string const &text)
Definition: AiApiBridge.h:312
Type type
Definition: AiApiBridge.h:303
Query2Request(GenerativeAI::EndPoint::Type eptype)
Definition: AiApiBridge.h:319
GenerativeAI::EndPoint::Type eptype
Definition: AiApiBridge.h:298
std::string prompt_json
Definition: AiApiBridge.h:306
Type
Definition: AiApiBridge.h:299
@ JSON
Definition: AiApiBridge.h:301
@ TEXT
Definition: AiApiBridge.h:300
std::string prompt_text
Definition: AiApiBridge.h:305
Definition: AiApiBridge.h:145
std::string id
Definition: AiApiBridge.h:148
std::string type
Definition: AiApiBridge.h:146
std::string text
Definition: AiApiBridge.h:147
std::string name
Definition: AiApiBridge.h:149
std::string caller_type
Definition: AiApiBridge.h:151
std::string content_json
Definition: AiApiBridge.h:152
Definition: AiApiBridge.h:227
std::string message
Definition: AiApiBridge.h:229
std::string type
Definition: AiApiBridge.h:228
std::string text
Definition: AiApiBridge.h:174
std::string name
Definition: AiApiBridge.h:170
std::string id
Definition: AiApiBridge.h:172
std::string content_json
Definition: AiApiBridge.h:173
Definition: AiApiBridge.h:168
struct AiResponseEx::GoogleContentItem::FunctionCall functionCall
std::string name
Definition: AiApiBridge.h:187
std::string type
Definition: AiApiBridge.h:185
std::string arguments
Definition: AiApiBridge.h:188
std::string id
Definition: AiApiBridge.h:184
Definition: AiApiBridge.h:180
std::string role
Definition: AiApiBridge.h:181
std::vector< ToolCall > tool_calls
Definition: AiApiBridge.h:191
std::string content
Definition: AiApiBridge.h:182
Definition: AiApiBridge.h:178
struct AiResponseEx::OpenAiChoice::Message message
std::string finish_reason
Definition: AiApiBridge.h:193
double index
Definition: AiApiBridge.h:179
Definition: AiApiBridge.h:162
std::string text
Definition: AiApiBridge.h:163
Definition: AiApiBridge.h:155
std::string type
Definition: AiApiBridge.h:157
std::string call_id
Definition: AiApiBridge.h:160
std::string status
Definition: AiApiBridge.h:158
std::string arguments
Definition: AiApiBridge.h:159
std::string name
Definition: AiApiBridge.h:161
std::string id
Definition: AiApiBridge.h:156
std::vector< Content > content
Definition: AiApiBridge.h:165
Definition: AiApiBridge.h:219
int ephemeral_5m_input_tokens
Definition: AiApiBridge.h:220
int ephemeral_1h_input_tokens
Definition: AiApiBridge.h:221
Definition: AiApiBridge.h:215
int cache_read_input_tokens
Definition: AiApiBridge.h:218
std::string inference_geo
Definition: AiApiBridge.h:225
int cache_creation_input_tokens
Definition: AiApiBridge.h:217
std::string service_tier
Definition: AiApiBridge.h:224
int input_tokens
Definition: AiApiBridge.h:216
struct AiResponseEx::Usage::CacheCreation cache_creation
int output_tokens
Definition: AiApiBridge.h:223
Definition: AiApiBridge.h:142
std::string type
Definition: AiApiBridge.h:199
std::string stop_reason
Definition: AiApiBridge.h:212
std::vector< GoogleContentItem > content_parts
Definition: AiApiBridge.h:210
std::vector< OpenAiOutputItem > output
Definition: AiApiBridge.h:206
std::string id
Definition: AiApiBridge.h:197
std::vector< AnthropicContentItem > content
Definition: AiApiBridge.h:201
std::string object
Definition: AiApiBridge.h:204
std::vector< OpenAiChoice > choices
Definition: AiApiBridge.h:207
struct AiResponseEx::@3 google
std::string model
Definition: AiApiBridge.h:196
GenerativeAI::ProviderID api_id
Definition: AiApiBridge.h:143
struct AiResponseEx::@1 anthropic
std::string role
Definition: AiApiBridge.h:200
struct AiResponseEx::@2 openai
struct AiResponseEx::Usage usage
std::string status
Definition: AiApiBridge.h:205
struct AiResponseEx::Error error
Definition: AiApiBridge.h:252
std::string content
AIが返したテキスト本文
Definition: AiApiBridge.h:254
std::string stop_reason
Definition: AiApiBridge.h:257
std::string error_message
エラーメッセージ
Definition: AiApiBridge.h:256
std::string error_status
エラー種別
Definition: AiApiBridge.h:255
bool completed
正常に完了したか
Definition: AiApiBridge.h:253
AiResponseEx ex
Definition: AiApiBridge.h:258
Definition: AiApiBridge.h:241
std::string object
Definition: AiApiBridge.h:243
std::string owned_by
Definition: AiApiBridge.h:245
std::string id
Definition: AiApiBridge.h:242
std::string created
Definition: AiApiBridge.h:244
Definition: AiApiBridge.h:248
std::vector< Model > list
Definition: AiApiBridge.h:249
AIレスポンスの解析結果を保持する内部構造体
Definition: AiApiBridge.h:234
AiResult(GenerativeAI::ProviderID api=GenerativeAI::ProviderID::Unknown)
Definition: AiApiBridge.h:236
bool is_error() const
Definition: AiApiBridge.h:278
struct AiResult::Data d
static AiResult Error(std::string const &stat, std::string const &msg)
Definition: AiApiBridge.h:283
std::string const & content() const
Definition: AiApiBridge.h:265
std::string const & error_message() const
Definition: AiApiBridge.h:273
std::string const & error_status() const
Definition: AiApiBridge.h:269
Type
Definition: GenerativeAI.h:172
Definition: GenerativeAI.h:95
ProviderID api_compatibility() const
Definition: GenerativeAI.h:156