- Introduced comprehensive unit tests for the OpenAI plugin, covering SSE parsing, sentinel matching, delta extraction, request building, and more. - Created a new markdown file detailing coding and naming conventions for the dstalk project, including guidelines for comments, naming rules, code organization, and memory management practices.
145 lines
8.0 KiB
C
145 lines
8.0 KiB
C
/**
|
||
* @file dstalk_services.h
|
||
* @brief Service vtable definitions for all plugin-provided services (AI, Session, HTTP, etc.).
|
||
* 所有插件提供的服务 vtable 定义(AI、会话、HTTP 等)。
|
||
* Copyright (c) 2026 dstalk contributors. GPLv3.
|
||
*/
|
||
|
||
#ifndef DSTALK_SERVICES_H
|
||
#define DSTALK_SERVICES_H
|
||
|
||
#include "dstalk_types.h"
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
/* ---- AI 服务 vtable / AI service vtable ---- */
|
||
/* 以名称如 "ai.openai" 或 "ai.anthropic" 注册 / Registered under names such as "ai.openai" or "ai.anthropic" */
|
||
typedef struct {
|
||
/* 配置服务商连接 (base_url, api_key, model 等) / Configure provider connection (base_url, api_key, model, etc.) */
|
||
int (*configure)(const char* provider, const char* base_url,
|
||
const char* api_key, const char* model,
|
||
int max_tokens, double temperature);
|
||
/* 发送单轮聊天补全请求 (阻塞) / Send a single-turn chat completion (blocking) */
|
||
dstalk_chat_result_t (*chat)(
|
||
const dstalk_message_t* history, int history_len,
|
||
const char* user_input,
|
||
const char* tools_json);
|
||
/* 通过回调实现流式令牌传输的聊天补全 / Send a chat completion with streaming tokens via callback */
|
||
dstalk_chat_result_t (*chat_stream)(
|
||
const dstalk_message_t* history, int history_len,
|
||
const char* user_input,
|
||
dstalk_stream_cb cb, void* userdata);
|
||
/* 释放 dstalk_chat_result_t 持有的资源 / Free resources held by a dstalk_chat_result_t */
|
||
void (*free_result)(dstalk_chat_result_t* result);
|
||
} dstalk_ai_service_t;
|
||
|
||
/* ---- 会话服务 vtable / Session service vtable ---- */
|
||
/* 以服务名称 "session" 注册 / Registered under service name "session" */
|
||
typedef struct {
|
||
/* 将消息追加到会话历史 / Append a message to the session history */
|
||
void (*add)(const dstalk_message_t* msg);
|
||
/* 清除会话历史中的所有消息 / Clear all messages from the session history */
|
||
void (*clear)(void);
|
||
/* 将会话历史保存到文件 (JSON); 成功返回 0 / Save session history to a file (JSON); returns 0 on success */
|
||
int (*save)(const char* path);
|
||
/* 从文件 (JSON) 加载会话历史; 成功返回 0 / Load session history from a file (JSON); returns 0 on success */
|
||
int (*load)(const char* path);
|
||
/* 获取完整消息历史; out_count 接收数组长度 / Get the full message history; out_count receives the array length */
|
||
const dstalk_message_t* (*history)(int* out_count);
|
||
/* 返回当前会话历史的近似令牌数 / Return the approximate token count of the current session history */
|
||
int (*token_count)(void);
|
||
} dstalk_session_service_t;
|
||
|
||
/* ---- 上下文服务 vtable / Context service vtable ---- */
|
||
/* 以服务名称 "context" 注册 / Registered under service name "context" */
|
||
typedef struct {
|
||
/* 计算消息数组中近似的令牌数 / Count approximate tokens in an array of messages */
|
||
size_t (*count_tokens)(const dstalk_message_t* msgs, int count);
|
||
/* 裁剪消息历史以适应 max_tokens; out/out_count 为新分配 / Trim message history to fit within max_tokens; out/out_count are newly allocated */
|
||
int (*trim)(const dstalk_message_t* in, int in_count,
|
||
dstalk_message_t** out, int* out_count,
|
||
size_t max_tokens);
|
||
} dstalk_context_service_t;
|
||
|
||
/* ---- HTTP 服务 vtable / HTTP service vtable ---- */
|
||
/* 以服务名称 "http" 注册 / Registered under service name "http" */
|
||
typedef struct {
|
||
/* POST JSON 体到主机; 返回响应体和 HTTP 状态码 / POST JSON body to a host; returns response body and HTTP status code */
|
||
int (*post_json)(const char* host, const char* port,
|
||
const char* target, const char* body,
|
||
const char* headers_json,
|
||
char** response_body, int* status_code);
|
||
/* POST 带流式响应; 令牌通过回调传递 / POST with streaming response; tokens are delivered via callback */
|
||
int (*post_stream)(const char* host, const char* port,
|
||
const char* target, const char* body,
|
||
const char* headers_json,
|
||
dstalk_stream_cb cb, void* userdata,
|
||
char** response_body, int* status_code);
|
||
} dstalk_http_service_t;
|
||
|
||
/* ---- 文件 I/O 服务 vtable / File I/O service vtable ---- */
|
||
/* 以服务名称 "file_io" 注册 / Registered under service name "file_io" */
|
||
typedef struct {
|
||
/* 读取整个文件内容到 *content; 成功返回 0 / Read entire file content into *content; returns 0 on success */
|
||
int (*read)(const char* path, char** content);
|
||
/* 将内容写入文件 (覆盖已有文件); 成功返回 0 / Write content to a file (overwrites if exists); returns 0 on success */
|
||
int (*write)(const char* path, const char* content);
|
||
} dstalk_file_io_service_t;
|
||
|
||
/* ---- 配置服务 vtable / Config service vtable ---- */
|
||
/* 以服务名称 "config" 注册 / Registered under service name "config" */
|
||
typedef struct {
|
||
/* 通过键名获取配置值; 未找到返回 NULL / Get a config value by key; returns NULL if not found */
|
||
const char* (*get)(const char* key);
|
||
/* 设置配置键值对; 成功返回 0 / Set a config key/value pair; returns 0 on success */
|
||
int (*set)(const char* key, const char* value);
|
||
/* 从 JSON 配置文件加载并合并键值对 / Load and merge key/value pairs from a JSON config file */
|
||
int (*load_file)(const char* path);
|
||
} dstalk_config_service_t;
|
||
|
||
/* ---- 工具服务 vtable / Tools service vtable ---- */
|
||
/* 以服务名称 "tools" 注册 / Registered under service name "tools" */
|
||
|
||
/* 已注册工具被调用时触发的处理器; 接收 JSON 参数, 返回 JSON 结果 / Handler invoked when a registered tool is called; receives JSON args, returns JSON result */
|
||
typedef char* (*dstalk_tool_handler_fn)(const char* args_json);
|
||
|
||
typedef struct {
|
||
/* 注册工具,包含名称、描述和 JSON Schema 参数 / Register a tool with name, description, and JSON Schema parameters */
|
||
int (*register_tool)(const char* name, const char* desc,
|
||
const char* params_schema,
|
||
dstalk_tool_handler_fn handler);
|
||
/* 取消注册之前注册的工具 / Unregister a previously registered tool */
|
||
void (*unregister_tool)(const char* name);
|
||
/* 获取所有已注册工具为 JSON 数组 (OpenAI 工具格式) / Get all registered tools as a JSON array (OpenAI tool format) */
|
||
char* (*get_tools_json)(void);
|
||
/* 按名称执行已注册工具,传入 JSON 参数 / Execute a registered tool by name with the given JSON arguments */
|
||
char* (*execute)(const char* name, const char* args_json);
|
||
} dstalk_tools_service_t;
|
||
|
||
/* ---- LSP 服务 vtable / LSP service vtable ---- */
|
||
/* 以服务名称 "lsp" 注册 / Registered under service name "lsp" */
|
||
typedef struct {
|
||
/* 启动指定语言的 LSP 服务器进程 / Start an LSP server process for the given language */
|
||
int (*start)(const char* server_cmd, const char* language);
|
||
/* 停止 LSP 服务器并清理资源 / Stop the LSP server and clean up resources */
|
||
void (*stop)(void);
|
||
/* 在 LSP 服务器中打开文档 / Open a document in the LSP server */
|
||
int (*open_document)(const char* uri, const char* content, const char* lang_id);
|
||
/* 在 LSP 服务器中关闭文档 / Close a document in the LSP server */
|
||
int (*close_document)(const char* uri);
|
||
/* 获取文档的诊断信息 (错误、警告) 以 JSON 格式返回 / Retrieve diagnostics (errors, warnings) for a document as JSON */
|
||
int (*get_diagnostics)(const char* uri, char** json_out);
|
||
/* 获取指定位置的悬停信息以 JSON 格式返回 / Retrieve hover information at a given position as JSON */
|
||
int (*get_hover)(const char* uri, int line, int col, char** json_out);
|
||
/* 获取指定位置的代码补全建议以 JSON 格式返回 / Retrieve code completion suggestions at a given position as JSON */
|
||
int (*get_completion)(const char* uri, int line, int col, char** json_out);
|
||
} dstalk_lsp_service_t;
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif // DSTALK_SERVICES_H
|